[gelöst] Lazarus DLL mit Delphiprojekt

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

[gelöst] Lazarus DLL mit Delphiprojekt

Beitrag von fliegermichl »

Hallo,

da ich in dem alten Delphi 5 keinen JSON Support habe, solche Dateien aber importieren soll, habe ich mit Lazarus eine DLL erstellt, die die eingelesenen Daten per Callback an mein Delphiprogramm sendet. Das funktioniert auch.

Die DLL wird per LoadLibrary geladen, die Adresse der aufzurufenden Procedure per GetProcAddress ermittelt.
Wenn ich nach dem Import die DLL per FreeLibrary freigeben will, bekomme ich in meinem Delphiprogramm eine Zugrifssverletzung aber der StackTrace ist leer.

Lasse ich FreeLibrary weg, läuft mein Programm zwar weiter aber hat 99% CPU Auslastung.
Ich habe jetzt in Lazarus ein kleines Testprogramm gemacht, das nur LoadLibrary und FreeLibrary enthält und auch da bekomme ich eine Zugriffsverletzung.

Irgendwie bin ich momentan ziemlich ratlos.
Dateianhänge
airteamconvert.lpr
Bibliothek für den Import von JSondateien
(6.23 KiB) 78-mal heruntergeladen
Zuletzt geändert von fliegermichl am So 21. Jan 2024, 10:56, insgesamt 1-mal geändert.

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Lazarus DLL mit Delphiprojekt

Beitrag von MmVisual »

Probiere mal dem Handle nach dem Free NIL zu zuweisen.
Und den Funktionen die man mit GetProcAddr geholt hatte ebenfalls ein NIL zu geben.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Lazarus DLL mit Delphiprojekt

Beitrag von fliegermichl »

Das hat nicht geholfen. Hätte mich auch gewundert.
Ich habe jetzt eine neue leere Bibliothek mit einem Testprogramm angelegt und dann Stück für Stück den Code aus der airteamconvert.lpr reinkopiert.
Dann jeden einzelnen Step getestet und es geht ohne Probleme.

Dann habe ich lediglich die testlibrary.dll umbenannt und in mein Programmverzeichnis kopiert.

Selbes Poblem. Sehr merkwürdig.

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Lazarus DLL mit Delphiprojekt

Beitrag von MmVisual »

Ändere die Codezeile so:

Code: Alles auswählen

procedure ConvertFile(inFile : PChar; cb : TCallBack); stdcall;
Also am Ende "stdcall;" oder "cdecl;" anfügen.

Und im aufrufenden Code, so habe ich das (innerhalb Lazarus Projekte) schon hin bekommen:

Code: Alles auswählen

Type
  T_ConvertFile = function(inFile: PChar; cb: TCallBack): Integer; stdcall;
  
Var _ConvertFile: T_ConvertFile;

// Teil von LoadDLL:
_ConvertFile := T_ConvertFile(GetProcAddress(DLLHandle, 'ConvertFile'));

Procedure ConvertFile(inFile: PChar; cb: TCallBack);
Begin
  LoadDLL();
  If (DLLHandle <> 0) And Assigned(_ConvertFile) Then
  Begin
    _ConvertFilex(inFile, cb); // DLL Aufruf
  End;
//  If (DLLHandle <> 0) Then UnLoadDLL();
End;
Abgesehen davon:
Einen Callback in eine DLL zu Packen finde ich grenzwertig. Lieber geben ein Result von dem DLL Aufruf zurück.
Sollte wirklich eine Callback Funktion aufgeruden werden, dann verpacke das mit einem Application.QueueAsyncCall(...) so dass es neu in die Windows Botschaften geht und da nicht noch wo hängen kann. Die Infos, die da von der DLL kommen mit "new" in ein neues Array/Objekt packen, das dann im Aufruf dann mit Dispose() wieder frei gegeben wird. Damit hängt auch nichts mehr und die DLL kommt sofort wieder zurück.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Lazarus DLL mit Delphiprojekt

Beitrag von fliegermichl »

Ich konnte die Ursache finden.

Das einbinden der Unit stddlg war die Ursache.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Lazarus DLL mit Delphiprojekt

Beitrag von fliegermichl »

MmVisual hat geschrieben:
Sa 20. Jan 2024, 10:41
Ändere die Codezeile so:

Code: Alles auswählen

procedure ConvertFile(inFile : PChar; cb : TCallBack); stdcall;
Also am Ende "stdcall;" oder "cdecl;" anfügen.
Das wäre nur dann nötig, wenn die DLL mit einem C Compiler erstellt wäre.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [gelöst] Lazarus DLL mit Delphiprojekt

Beitrag von fliegermichl »

Falls sich jemand diese Kommunikation zwischen Hauptprogramm und DLL per Callback anschauen möchte, habe ich hier diese DLL mit einem Testprogramm und einer Beispiel JSON Datei zusammengestellt.

Es muß zuerst die librarytest.lpr compiliert werden damit die DLL erstellt wird.

Edit: Falls du dir die Struktur der JSON Datei anschauen willst, unter ..\Lazarus\Tools\JSonviewer gibt es einen JSon Dateibetrachter.
Dateianhänge
LibraryTest.zip
Beispielprojekt Kommunikation per Callback
(151.46 KiB) 59-mal heruntergeladen

Antworten