Variable aus DLL importieren

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Variable aus DLL importieren

Beitrag von dl5eu »

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

mse
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

Beitrag von mse »

Bist du sicher, dass das exportierte Symbol exakt 'status' inklusive Gross- und Kleinschreibung ist? Vielleicht ist die Fehlermeldung missverständlich.

dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Re: Variable aus DLL importieren

Beitrag von dl5eu »

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

mse
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

Beitrag von mse »

dl5eu hat geschrieben:Die Funktionsaufrufe funktionieren wie gewünscht, das habe ich auch bei einer anderen DLL schon gemacht.

Dann versuche doch noch einen Funktionsaufruf in *dieser* DLL. Edit: ich sehe du schreibst "auch", -> Funktionsaufrufe in *dieser* DLL funktionieren?
Vielleicht wird nicht die DLL geladen, die du erwartest. Auf Windows ist das Sicherste, die DLL in das Verzeichnis der *.exe Datei zu kopieren.
Nur auf Variablen in einer DLL zugreifen ist neu für mich. Nach meinen Recherchen sollte es so gehen, tut es aber nicht.

Die Dokumentation schreibt nichts Anderes:
https://www.freepascal.org/docs-html/cu ... 3-710004.2
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.

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/

dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Re: Variable aus DLL importieren

Beitrag von dl5eu »

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

dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Re: Variable aus DLL importieren

Beitrag von dl5eu »

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

Thandor
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

Beitrag von Thandor »

Ist in der Headerdatei eventuell irgendwo ein "#define status user_status" ?

Antworten