Hallo Forumsmitglieder,
ich habe eine DLL eines Drittanbieters, die Funktionen zur Steuerung eines USB-Gerätes bereitstellt. Der Quellcode ist leider nicht verfügbar. Die Funktionen kann ich aus Free Pascal heraus aufrufen, das funktioniert.
Die DLL exportiert aber auch ein paar Variablen, auf die ich aus meiner Pascal-Unit zugreifen muss. Dazu habe ich analog zu den Funktionen folgendes in meiner Pascal-Unit gemacht (die Variable sei "status"):
var
status: Integer; external 'name der DLL' Name 'status';
Das lässt sich kompilieren, aber beim Zugriff auf "status" erhalte ich die Meldung, dass der Prozedureinsprungpunkt "status" nicht gefunden wurde. Richtig, es handelt sich ja auch nicht um eine Funktion oder Prozedur. Wie aber muss ich den Zugriff auf die Variable in der DLL in meiner Pascal-Unit angeben, damit es funktioniert? Zum Aufruf von Funktionen in DLLs habe ich im Netz zwar einiges gefunden, aber nicht zum Variablenzugriff.
Kann mir evtl. jemand von Euch helfen?
Herzlichen Dank,
Ralf / DL5EU
Variable aus DLL importieren
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Variable aus DLL importieren
Bist du sicher, dass das exportierte Symbol exakt 'status' inklusive Gross- und Kleinschreibung ist? Vielleicht ist die Fehlermeldung missverständlich.
Re: Variable aus DLL importieren
Hallo mse,
Danke für die schnelle Antwort.
Ja, ich bin sicher. In der C-Headerdatei ist angegeben
extern int status;
Die Funktionsaufrufe funktionieren wie gewünscht, das habe ich auch bei einer anderen DLL schon gemacht. Nur auf Variablen in einer DLL zugreifen ist neu für mich. Nach meinen Recherchen sollte es so gehen, tut es aber nicht. Der Jedi-Codeformatierer stört sich auch an dieser Art der Deklaration, aber das nur am Rande. Kompilieren tut's.
Könnte es sein, dass ich noch eine Datei irgendwie einbinden muss? In C gibt es die Import-Libraries mit denen u.U. ein Programm gelinkt werden muss. Die hier infrage stehende DLL ist allerdings im System installiert und die Angabe des Names bei "external" genügt, damit die Funktionsaufrufe klappen.
Ralf
Danke für die schnelle Antwort.
Ja, ich bin sicher. In der C-Headerdatei ist angegeben
extern int status;
Die Funktionsaufrufe funktionieren wie gewünscht, das habe ich auch bei einer anderen DLL schon gemacht. Nur auf Variablen in einer DLL zugreifen ist neu für mich. Nach meinen Recherchen sollte es so gehen, tut es aber nicht. Der Jedi-Codeformatierer stört sich auch an dieser Art der Deklaration, aber das nur am Rande. Kompilieren tut's.
Könnte es sein, dass ich noch eine Datei irgendwie einbinden muss? In C gibt es die Import-Libraries mit denen u.U. ein Programm gelinkt werden muss. Die hier infrage stehende DLL ist allerdings im System installiert und die Angabe des Names bei "external" genügt, damit die Funktionsaufrufe klappen.
Ralf
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Variable aus DLL importieren
Dann versuche doch noch einen Funktionsaufruf in *dieser* DLL. Edit: ich sehe du schreibst "auch", -> Funktionsaufrufe in *dieser* DLL funktionieren?dl5eu hat geschrieben: Die Funktionsaufrufe funktionieren wie gewünscht, das habe ich auch bei einer anderen DLL schon gemacht.
Vielleicht wird nicht die DLL geladen, die du erwartest. Auf Windows ist das Sicherste, die DLL in das Verzeichnis der *.exe Datei zu kopieren.
Die Dokumentation schreibt nichts Anderes:Nur auf Variablen in einer DLL zugreifen ist neu für mich. Nach meinen Recherchen sollte es so gehen, tut es aber nicht.
https://www.freepascal.org/docs-html/cu ... 3-710004.2
FPC linkt die mit "external" verwendeten Bibliotheken automatisch. Es empfiehlt sich versuchsweise die DLL in das Verzeichnis der *.exe zu kopieren und mit "dumpbin" oder einem anderen DLL Tool die exportierten Symbole zu kontrollieren, z.B http://www.dependencywalker.com/Könnte es sein, dass ich noch eine Datei irgendwie einbinden muss? In C gibt es die Import-Libraries mit denen u.U. ein Programm gelinkt werden muss. Die hier infrage stehende DLL ist allerdings im System installiert und die Angabe des Names bei "external" genügt, damit die Funktionsaufrufe klappen.
Re: Variable aus DLL importieren
Danke für den Hinweis.
Vielleicht habe ich mich missverständlich ausgedrückt. Die Aufrufe der Funktionen in der DDL, die auch die Variablen enthält, funktionieren (Deklaration mit __stdcall; external 'Name_der_DLL' Name 'Name_der_Funktion_in_der_DLL').
Den Passus in der Dokumentation hatte ich schon gefunden. Daher bin ich auch davon ausgegangen, dass es funktionieren müsste. Ich werde wie vorgeschlagen überprüfen, ob die Variable tatsächlich in der DLL vorhanden ist.
Grüße,
Ralf / DL5EU
Vielleicht habe ich mich missverständlich ausgedrückt. Die Aufrufe der Funktionen in der DDL, die auch die Variablen enthält, funktionieren (Deklaration mit __stdcall; external 'Name_der_DLL' Name 'Name_der_Funktion_in_der_DLL').
Den Passus in der Dokumentation hatte ich schon gefunden. Daher bin ich auch davon ausgegangen, dass es funktionieren müsste. Ich werde wie vorgeschlagen überprüfen, ob die Variable tatsächlich in der DLL vorhanden ist.
Grüße,
Ralf / DL5EU
Re: Variable aus DLL importieren
Hallo mse,
nochmals Danke für Deinen Tipp!
Ich habe mir die DLL mit dem Dependency Walker angesehen. Die Variable in der DLL heißt scheinbar "user_status" und nicht "status". Keine Ahnung, warum das in der Headerdatei anders angegeben ist. Mit korrigiertem Namen funktioniert der Aufruf.
Beste Grüße,
Ralf / DL5EU
nochmals Danke für Deinen Tipp!
Ich habe mir die DLL mit dem Dependency Walker angesehen. Die Variable in der DLL heißt scheinbar "user_status" und nicht "status". Keine Ahnung, warum das in der Headerdatei anders angegeben ist. Mit korrigiertem Namen funktioniert der Aufruf.
Beste Grüße,
Ralf / DL5EU
-
- Beiträge: 153
- Registriert: Sa 30. Jan 2010, 18:17
- OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Variable aus DLL importieren
Ist in der Headerdatei eventuell irgendwo ein "#define status user_status" ?