[gelöst] Lazarus DLL mit Delphiprojekt
- 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
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.
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) 80-mal heruntergeladen
Zuletzt geändert von fliegermichl am So 21. Jan 2024, 10:56, insgesamt 1-mal geändert.
-
- 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
Probiere mal dem Handle nach dem Free NIL zu zuweisen.
Und den Funktionen die man mit GetProcAddr geholt hatte ebenfalls ein NIL zu geben.
Und den Funktionen die man mit GetProcAddr geholt hatte ebenfalls ein NIL zu geben.
EleLa - Elektronik Lagerverwaltung - www.elela.de
- 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
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.
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.
-
- 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
Ändere die Codezeile so:
Also am Ende "stdcall;" oder "cdecl;" anfügen.
Und im aufrufenden Code, so habe ich das (innerhalb Lazarus Projekte) schon hin bekommen:
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.
Code: Alles auswählen
procedure ConvertFile(inFile : PChar; cb : TCallBack); stdcall;
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;
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
- 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
Ich konnte die Ursache finden.
Das einbinden der Unit stddlg war die Ursache.
Das einbinden der Unit stddlg war die Ursache.
- 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
Das wäre nur dann nötig, wenn die DLL mit einem C Compiler erstellt wäre.MmVisual hat geschrieben: ↑Sa 20. Jan 2024, 10:41Ändere die Codezeile so:
Also am Ende "stdcall;" oder "cdecl;" anfügen.Code: Alles auswählen
procedure ConvertFile(inFile : PChar; cb : TCallBack); stdcall;
- 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
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.
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) 60-mal heruntergeladen