Variable aus DLL importieren

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Variable aus DLL importieren

Beitragvon dl5eu » 22. Apr 2018, 09:52 Variable aus DLL importieren

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
dl5eu
 
Beiträge: 22
Registriert: 12. Sep 2013, 11:40

Beitragvon mse » 22. Apr 2018, 11:46 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.
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon dl5eu » 22. Apr 2018, 12:17 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
dl5eu
 
Beiträge: 22
Registriert: 12. Sep 2013, 11:40

Beitragvon mse » 22. Apr 2018, 12:48 Re: Variable aus DLL importieren

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/
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon dl5eu » 22. Apr 2018, 15:28 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
dl5eu
 
Beiträge: 22
Registriert: 12. Sep 2013, 11:40

Beitragvon dl5eu » 22. Apr 2018, 18:40 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
dl5eu
 
Beiträge: 22
Registriert: 12. Sep 2013, 11:40

Beitragvon Thandor » 23. Apr 2018, 10:31 Re: Variable aus DLL importieren

Ist in der Headerdatei eventuell irgendwo ein "#define status user_status" ?
Thandor
 
Beiträge: 118
Registriert: 30. Jan 2010, 18:17
Wohnort: Berlin
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 1.6 mit FPC 3.0.0 (32Bit) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste

porpoises-institution
accuracy-worried