Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
268to272
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
268to272
268to272
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

DLL aus Exceltabelle aufrufen

DLL aus Exceltabelle aufrufen
17.06.2003 15:21:29
Peter Fraidling
Hallo Forum,

ich arbeite seit einigen Jahren mit mehreren DLLs, die in Delphi erstellt wurden und die in Excel direkt in einem Sheet aufgerufen werden (also nicht in VBA). Dazu wird die Funktion AUFRUFEN verwendet. Dies ging die ganzen Jahre gut, bis ich auf Windows 2000 und Excel 2000 umgestiegen bin. Seither zeigen die Funktionen, die in der DLL aufgerufen werden, immer nur das Ergebnis 0 oder FALSCH. Meine Vermutung ist, dass sich an den Aufrufkonventionen etwas geändert hat - ich kann aber dazu nirgends irgend welche Informationen finden. Kann mir hier jemand weiter helfen? Herzlichen Dank!

Peter


18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: DLL aus Exceltabelle aufrufen
17.06.2003 15:49:16
Peter Fraidling

Hallo Nike,

vielen Dank für den Tip! Leider verstehe ich nicht, was der VBA-Code, der dort zu finden ist, bewirkt (was steht dabei in B1?, was passiert durch den ....AddFromFile-Befehl?). Kannst Du mir hierzu ein paar Hinweise geben?

Zudem will ich eigentlich vermeiden, ein Makro sozusagen zwischen Tabelle und Dll schieben zu müssen. Mit der normalen Excelfunktion (Bsp.)

=AUFRUFEN("meine.dll";"meinefunction";"II!";A1)

wurde in xl8(97) in meiner DLL "meine.dll" die Funktion "meinefunction" aufgerufen und dabei der Wert in A1 als SmallInt-Parameter übergeben und ein SmallInt-Wert als Ergebnis erwartet. Die dazu gehörende Definition in der DLL (in Delphi) lautet:

function meinefunction(x: Smallint): Smallint; stdcall;

Dies hat - wie gesagt - prima geklappt, bis dann Excel 2000 kam!

Grund dafür, dass ich kein Makro verwenden möchte ist, dass die DLL auch von Anwendern benutzt werden soll, die keine Ahnung haben, wie man ein Makro einbindet usw.

Nochmals herzlichen Dank!

Peter


Anzeige
Re: DLL aus Exceltabelle aufrufen
17.06.2003 15:53:09
RAnton

Hallo peter,
hier mal den Hilfetext dazu, vielleicht hilft der weiter.

CALL
Siehe auch

Ruft eine Prozedur in einer DLL (Dynamic Link Library) oder Code-Ressource auf. Für diese Funktion gibt es zwei Syntaxversionen. Die Syntax 1 können Sie nur für eine bereits angemeldete (registrierte) Code-Ressource einsetzen, die auf Argumente der Funktion REGISTER zurückgreift. Die Syntax 2a oder 2b können Sie immer dann einsetzen, wenn Sie eine Code-Ressource gleichzeitig anmelden und aufrufen möchten.

Wichtig Diese Funktion sollte nur von erfahrenen Microsoft Excel-Anwendern eingesetzt werden, Wenn Sie die Funktion CALL falsch verwenden, kann dies unter Umständen so schwerwiegende Fehler zur Folge haben, dass Sie den Computer neu starten müssen.

Syntax 1

Wird zusammen mit REGISTER verwendet

CALL(Registrier;Argument1;...)

Syntax 2a

Wird selbständig verwendet (in Microsoft Excel für Windows)

CALL(Modul;Prozedur;Datentyp;Argument1;...)

Syntax 2b

Wird selbständig verwendet (in Microsoft Excel für den Macintosh)

CALL(Datei;Ressource;Datentyp;Argument1;...)

Registrier ist ein Wert, den eine der Funktionen REGISTER oder REGISTER.KENNUMMER geliefert hat.

Argument1; ... sind die Argumente, die an die jeweilige Prozedur übergeben werden sollen.

Modul ist eine in Anführungszeichen stehende Zeichenfolge, die den Namen der DLL-Datei (Dynamic Link Library, DLL) angibt, zu der die aufzurufende Prozedur in Microsoft Excel für Windows gehört.

Datei ist der Name der Datei, zu der die aufzurufende Prozedur in Microsoft Excel für den Macintosh gehört.

Prozedur ist eine Zeichenfolge, die in Microsoft Excel für Windows den Namen angibt, unter dem die aufzurufende Funktion in der angegebenen DLL-Datei abgelegt ist. Sie können auch die Ordnungszahl verwenden, die der Funktion in der Anweisung EXPORTE der Moduldefinitionsdatei (.DEF) zugeordnet ist. Eine Ordnungszahl darf nicht in Anführungszeichen stehen.

Ressource ist in Microsoft Excel für den Macintosh der Name der gewünschten Code-Ressource. Sie können alternativ dazu die Kennnummer der Ressource angeben, wobei diese Kennnummer allerdings nicht in Anführungszeichen stehen darf.

Datentyp ist eine in Anführungszeichen stehende Zeichenfolge, die sowohl den Datentyp des Rückgabewertes als auch die Datentypen der Argumente angibt, die an die jeweilige DLL-Prozedur bzw. Code-Ressource übergeben werden. Der erste Buchstabe des Arguments Datentyp gibt den Rückgabewert an. Die Bedeutungen der Buchstaben, die für das Argument Datentyp verwendet werden können, sind ausführlich unter Einsetzen der Funktion CALL und REGISTER erläutert. Bei selbständigen DLL-Dateien oder Code-Ressourcen (XLL-Dateien) kann dieses Argument fehlen.

Beispiel

Syntax 1 (32-Bit Microsoft Excel)

In 32-Bit Microsoft Excel für Windows meldet die folgende innerhalb eines Makros stehende Formel die zu 32-Bit Microsoft Windows gehörende Funktion GetTickCount an. GetTickCount liefert eine Zahl, die angibt, wie viele Millisekunden seit dem letzten Start von Microsoft Windows vergangen sind.

REGISTER("Kernel32","GetTickCount","J")
Diese REGISTER-Funktion befindet sich z. B. in der Zelle A5. Sobald die Funktion GetTickCount innerhalb Ihres Makros angemeldet ist, können Sie mit Hilfe der Funktion CALL ermitteln, wie viele Millisekunden vergangen sind:

CALL(A5)
Syntax 1 (16-Bit Microsoft Excel)

In 16-Bit Microsoft Excel für Windows meldet die folgende innerhalb eines Makros stehende Formel die zu 16-Bit Microsoft Windows gehörende Funktion GetTickCount an. GetTickCount liefert eine Zahl, die angibt, wie viele Millisekunden seit dem letzten Start von Microsoft Windows vergangen sind.

REGISTER("User","GetTickCount","J")
Diese REGISTER-Funktion befindet sich z. B. in der Zelle A5. Sobald die Funktion GetTickCount innerhalb Ihres Makros angemeldet ist, können Sie mit Hilfe der Funktion CALL ermitteln, wie viele Millisekunden vergangen sind:

CALL(A5)
Beispiel

Syntax 2a (32-Bit Microsoft Excel)

Mit der folgenden CALL-Formel (Syntax 2a) können Sie in einer Tabelle heraus die Funktion GetTickCount aufrufen:

CALL("Kernel32","GetTickCount","J!")
Durch das innerhalb des Arguments Datentyp stehende ! wird Microsoft Excel dazu veranlasst, die CALL-Funktion immer dann erneut auszuwerten, wenn die Tabelle neu berechnet wird. Somit wird die vergangene Zeit jedesmal aktualisiert, wenn die Tabelle neu berechnet wird.

Syntax 2a (16-Bit Microsoft Excel)

Mit der folgenden CALL-Formel (Syntax 2a) können Sie in einer Tabelle heraus die Funktion GetTickCount aufrufen:

CALL("User","GetTickCount","J!")
Durch das innerhalb des Arguments Datentyp stehende ! wird Microsoft Excel dazu veranlasst, die CALL-Funktion immer dann erneut auszuwerten, wenn die Tabelle neu berechnet wird. Somit wird die vergangene Zeit jedesmal aktualisiert, wenn die Tabelle neu berechnet wird.

Tipp Mit Hilfe der optionalen Argumente der Funktion REGISTER können Sie einer Funktion einen benutzerdefinierten Namen zuweisen. Dieser Name erscheint dann im Dialogfeld Funktion einfügen, und Sie können die Funktion aufrufen, indem Sie deren benutzerdefinierten Namen innerhalb einer Formel verwenden. Weitere Informationen finden Sie unter REGISTER.


Gruß
RAnton

Anzeige
Re: DLL aus Exceltabelle aufrufen
17.06.2003 15:56:29
Thomas Risi

Hallo Peter

Das was Nike gepostet hat, kannst Du nicht auf Deine DLL anwenden.

Ich habe es mal eben mit dem Beispiel aus der Excel-Hilfe versucht (Excel 2000), und es funktioniert auch nicht. Dann noch mit einer von meinen DLL's, geht auch nicht.

Deine Funktion erwartet ein Argument, sollte es dann nicht "=AUFRUFEN("meine.dll";"meinefunction";"I!";A1)" heißen ?

Gruß
Thomas

Risi Thomas Softwareentwicklung



Anzeige
Re: DLL aus Exceltabelle aufrufen
17.06.2003 16:02:29
Peter Fraidling

Hallo Thomas,

das erste Zeichen von "II!" gibt das Format des Rückgabewertes der Funktion an, daher müssen's zwei Zeichen sein. Ich habe es aber sicherheitshalber gerade eben trotzdem mit "I!" versucht - Leider Fehlanzeige!

Gruß
Peter

Re: DLL aus Exceltabelle aufrufen
17.06.2003 16:11:21
Peter Fraidling

Hallo RAnton,

diesen Hilfetext habe ich schon mehrmals heftig studiert und bin der festen Meinung, dass ich die Syntax 2a verwende. Übrigens stimmt die Hilfe nicht: eine Funktion "CALL" kennt Excel nicht, sondern bringt dann den Fehler #NAME?. "AUFRUFEN" statt dessen kennt Excel und bringt keine Fehlermeldung, sondern nur kein Ergebnis (immer 0 oder FALSCH).

Gruß
Peter


Anzeige
Re: DLL aus Exceltabelle aufrufen
17.06.2003 16:19:12
RAnton

Hallo Peter,
welche Delphi-Version verwendest du?

Gruß
RAnton

Re: DLL aus Exceltabelle aufrufen
17.06.2003 16:22:20
Peter Fraidling

Hallo RAnton,

Delphi 3.0 Professional

Gruß
Peter

Re: DLL aus Exceltabelle aufrufen
17.06.2003 16:25:00
RAnton

Hallo,

soweit ich mich erinnern kann ist das ein 16-Bit System. D.h. du müsstest die DLL für ein 32-Bit System mit Delphi-6 compilieren um dann die COM-Schnittstelle richtig bedienen zu können.

Gruß
RAnton

Re: DLL aus Exceltabelle aufrufen
17.06.2003 16:28:11
Peter Fraidling


nein, Delphi ist ab Version 2 auf 32 Bit. Sonst hätte die DLL auch mit Excel97 (unter Win95 und 98!) nicht funktionieren können!

Gruß
Peter

Re: DLL aus Exceltabelle aufrufen
17.06.2003 16:46:47
RAnton

Hallo,
ok, wie ist es mit den Rechten auf dem System. Bist du als Administrator oder als User angemeldet. Hast du alle Recht zum Ausführen der DLL´s.

Gruß
RAnton

Anzeige
Re: DLL aus Exceltabelle aufrufen
17.06.2003 16:52:36
Peter Fraidling

Hallo,

laut unserem Admin (ich selbst bin keiner) bin ich als "User mit Admin-Rechten" angemeldet. In diesen Rechtefragen kenne ich mich leider nicht besonders aus. Laut Admin sollte ich auf meinem Rechner ALLES machen dürfen. Gibts evtl. irgend einen speziellen Punkt, den ich dazu noch einmal prüfen oder nachfragen sollte?

Gruß
Peter


Re: DLL aus Exceltabelle aufrufen
17.06.2003 17:08:05
RAnton

Hallo
geh doch mal auf Eigenschaften bei dem DLL und schau dir deine Berechtigungen an. Hier müsstest du alle Rechte besitzen.

Gruß
RAnton

Re: DLL aus Exceltabelle aufrufen
17.06.2003 17:11:09
Thomas Risi

Hallo Peter

Tja, das hier ist aus der MSDN ...

The information in this article applies to:
Microsoft Excel 2000

This article was previously published under Q238996
SYMPTOMS
When you use the CALL function in your worksheet, your formula always returns a value of FALSE.
CAUSE
The CALL function has been disabled from use on worksheets in Microsoft Excel 2000. This was done to protect you from a security vulnerability that exists in earlier versions of Microsoft Excel.

For additional information about the CALL function vulnerability, click the article number below to view the article in the Microsoft Knowledge Base:
196791 XL97: Patch Available for Excel CALL Vulnerability


Ich hatte es schonmal gelesen, aber nicht gleich gefunden. Also mußt Du wohl für Deine DLL Wrapperfunktionen mit VBA schreiben, oder Du kompilierst die Funktionen in eine XLL, das funktioniert nämlich. Ein Beispiel dafür findest Du auf meiner Webseite (C++Makros), aber mit Delphi wird das wohl nicht so einfach ;))


Gruß
Thomas

Risi Thomas Softwareentwicklung



Anzeige
Re: DLL aus Exceltabelle aufrufen
17.06.2003 19:51:47
Peter Fraidling

Hallo,

ich musste leider dringend weg! Ich schau morgen mal nach und melde mich dann wieder. Für heute schon mal herzlichen Dank für die Unterstützung!

Gurß
Peter

Re: DLL aus Exceltabelle aufrufen
18.06.2003 08:46:48
Peter Fraidling

Guten Morgen Thomas,

vielen Dank für den Hinweis! Das dürfte genau der Grund für mein Problem sein (leider). Eigentlich eine Frechheit von MS, eine doch recht wichtige Funktion einfach zu killen.

Teilst Du mir bitte noch dir URL Deiner Webseite mit, das C++-Beispiel würde ich mir gerne anschauen!

Nochmals herzlichen Dank!

Gruß
Peter

Re: DLL aus Exceltabelle aufrufen
18.06.2003 13:51:56
Thomas Risi

Hallo Peter

Bin jetzt erst zurück ...


Also, die URL ist http://rtsoftwaredevelopment.de

Eigentlich sollte auch der Link (unten) dort hinführen.

Gruß
Thomas

Risi Thomas Softwareentwicklung



Anzeige
Re: DLL aus Exceltabelle aufrufen
18.06.2003 14:24:09
Peter Fraidling

Hallo Thomas,

danke! Das mit dem Link stimmt, ich hatte es nur nicht kapiert!

Ich werde nun wohl doch eine VBA-Brücke einbauen: die ersten Versuche heute vormittag waren erfolgreich. Es genügt in ein VBA-Modul für jede Funktion der DLL ein "declare function ..." zu schreiben - schon klappts.

Auf jeden Fall HERZLICHEN DANK für die Hilfe, auch allen anderen, die sich Gedanken gemacht haben!

Gruß
Peter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige