DLLs als Windows-Plugin mit Lazarus
- Lincoln Six Echo
- Beiträge: 138
- Registriert: Di 26. Aug 2014, 16:42
- OS, Lazarus, FPC: Win10, Debian
- CPU-Target: I7/I9/Q9650/u.a.
- Wohnort: Hamburg
DLLs als Windows-Plugin mit Lazarus
Von marktführenden Bildbearbeitungsprogrammen über diverse seit Jahrzehnten ausgereifte Musik- und Videoprogramme bis zur Business-Software bieten diese fast alle die Möglichkeit über Plugins den Leistungskatalog zu erweitern.
Im Bereich Multimedia sind darauf ganze Unternehmen aufgebaut die nur solche Plugins produzieren, virtuelle Musikinstrumente, virtuelle Tonstudiotechnik uvm.
Ich habe nun selbst solche Plugins gebaut. Das sind erstmal ganz normale DLLs, die kann man mit Lazars wunderbar erstellen. In meinen Programmen (die ebenfalls mit Lazarus gebaut sind) laufen die alle fehlerfrei.
Nun nehme ich aber so ein Megaprodukt und will mein Plugin darin laufen lassen. Programm A : Alles läuft so wie es soll. Programm B: dito. Programm C aber meldet es sei eine 32bit DLL die nicht mehr unterstützt wird. Programm D hängt sich ohne weitere Fehlermeldung auf und Programm E verkündet per Bildschirm-Dialog die entsprechende DLL sei keine korrekte Windows 64 DLL.
Ich habe nun sämtliche Einstellungen und Compiler-Schalter durchprobiert, es ändert nichts. Es bleibt dabei das einige Programme melden, es sei keine korrekte Windows-64 DLL.
Hat hier vielleicht jemand ein ähnliches Problem ? Sind mit Lazarus und dem FPC erstellte DLLs inkompatibel ?
Im Bereich Multimedia sind darauf ganze Unternehmen aufgebaut die nur solche Plugins produzieren, virtuelle Musikinstrumente, virtuelle Tonstudiotechnik uvm.
Ich habe nun selbst solche Plugins gebaut. Das sind erstmal ganz normale DLLs, die kann man mit Lazars wunderbar erstellen. In meinen Programmen (die ebenfalls mit Lazarus gebaut sind) laufen die alle fehlerfrei.
Nun nehme ich aber so ein Megaprodukt und will mein Plugin darin laufen lassen. Programm A : Alles läuft so wie es soll. Programm B: dito. Programm C aber meldet es sei eine 32bit DLL die nicht mehr unterstützt wird. Programm D hängt sich ohne weitere Fehlermeldung auf und Programm E verkündet per Bildschirm-Dialog die entsprechende DLL sei keine korrekte Windows 64 DLL.
Ich habe nun sämtliche Einstellungen und Compiler-Schalter durchprobiert, es ändert nichts. Es bleibt dabei das einige Programme melden, es sei keine korrekte Windows-64 DLL.
Hat hier vielleicht jemand ein ähnliches Problem ? Sind mit Lazarus und dem FPC erstellte DLLs inkompatibel ?
- af0815
- Lazarusforum e. V.
- Beiträge: 6848
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: DLLs als Windows-Plugin mit Lazarus
Das liegt vermutlich and dem, das DLL nicht gleich DLL ist. Da hängt einiges davon ab, was das Target der DLL ist und auch wie die Parameterübergaben definiert sind. In welchen Format wird die die DLL vom Programm erwartet ? C oder C++ kompatibel, mit welchen originalen Compiler erstellt. Das macht die Sache nicht übersichtlich. Über das stolpert man auch, wenn man Header Dateien für den Zugriff auf Dll's versucht zu übersetzen.
Schon einmal die originalen Erweiterung mit einem PE-Viewer angeschaut und mit deiner DLL verglichen ?
Schon einmal die originalen Erweiterung mit einem PE-Viewer angeschaut und mit deiner DLL verglichen ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- Lincoln Six Echo
- Beiträge: 138
- Registriert: Di 26. Aug 2014, 16:42
- OS, Lazarus, FPC: Win10, Debian
- CPU-Target: I7/I9/Q9650/u.a.
- Wohnort: Hamburg
Re: DLLs als Windows-Plugin mit Lazarus
Da die Hosts alle in C++ gebaut sind habe ich alle Parameterübergaben als "cdecl" definiert. In den meisten Programmen laufen die ja auch ohne Fehler.
Es gibt aber auch ein sehr beliebtes Programm das komplett in Delphi erstellt ist. Da wird mir angezeigt das mein Plugin beim Laden einen Fehler verursacht und deshalb nicht ausgeführt wird. Nur welcher das ist behält das Programm leider für sich.
Ich frage mich ob ich als Entwickler überhaupt mit Lazarus die Möglichkeiten habe DLLs zu erstellen die dann auch in allen Hosts laufen.
Bin mir nicht sicher was du mit PE-Viewer meinst. Ich habe hier natürlich eine Menge solcher Tools, einen Resource-Editor, ein Tool um die Sprungadressen einer beliebigen DLL anzuzeigen, Hex-Viewer uvm.
Es gibt aber auch ein sehr beliebtes Programm das komplett in Delphi erstellt ist. Da wird mir angezeigt das mein Plugin beim Laden einen Fehler verursacht und deshalb nicht ausgeführt wird. Nur welcher das ist behält das Programm leider für sich.
Ich frage mich ob ich als Entwickler überhaupt mit Lazarus die Möglichkeiten habe DLLs zu erstellen die dann auch in allen Hosts laufen.
Bin mir nicht sicher was du mit PE-Viewer meinst. Ich habe hier natürlich eine Menge solcher Tools, einen Resource-Editor, ein Tool um die Sprungadressen einer beliebigen DLL anzuzeigen, Hex-Viewer uvm.
- Lincoln Six Echo
- Beiträge: 138
- Registriert: Di 26. Aug 2014, 16:42
- OS, Lazarus, FPC: Win10, Debian
- CPU-Target: I7/I9/Q9650/u.a.
- Wohnort: Hamburg
Re: DLLs als Windows-Plugin mit Lazarus
Ich hatte zuerst vermutet das es an der Ausrichtung von Records liegen könnte Aber $A+ oder $A- ändert leider nichts. Auch $H+ und $H- ergibt keine Änderung des Problems. Resources sind keine eingebunden. Aber auch wenn ich welche einbinde ändert das nichts.
- af0815
- Lazarusforum e. V.
- Beiträge: 6848
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: DLLs als Windows-Plugin mit Lazarus
CFF Explorer ist so ein spezielles Tool. Damit kann man sich einiges der internas von exe und dll ansehen.
Wenn ein Programm externe Schnittstellen anbietet dann sollten die auch Dokumentiert sein.
Nein, das kannst du nicht, es müssen immer beide Seiten mitspielen bzw. auch die Schnittstellen dokumentieren.Ich frage mich ob ich als Entwickler überhaupt mit Lazarus die Möglichkeiten habe DLLs zu erstellen die dann auch in allen Hosts laufen.
Wenn ein Programm externe Schnittstellen anbietet dann sollten die auch Dokumentiert sein.
Da wird es schwierig wenn die Schnittstelle nicht dokumentiert ist. Gerade bei Delphi habe ich auch Probleme mit den UCS2 Strings gehabt, bis ich die sauber in Lazarus/fpc bekommen habe. Nur dort war das Interface bei mir umgekehrt Delphi-dll in Lazarus verwenden.Es gibt aber auch ein sehr beliebtes Programm das komplett in Delphi erstellt ist. Da wird mir angezeigt das mein Plugin beim Laden einen Fehler verursacht und deshalb nicht ausgeführt wird. Nur welcher das ist behält das Programm leider für sich.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: DLLs als Windows-Plugin mit Lazarus
Willst du ein identisches Plugin in verschiedenen Programmen einbinden? Dann könnte es vielleicht einfach daran liegen, dass du eine 32-Bit DLL erzeugt hast, das Programm aber ein 64-Programm ist. Programm und Plugin müssen immer für die selbe Architektur erstellt sein.Lincoln Six Echo hat geschrieben: Mi 5. Apr 2023, 13:11 Da die Hosts alle in C++ gebaut sind habe ich alle Parameterübergaben als "cdecl" definiert. In den meisten Programmen laufen die ja auch ohne Fehler.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
- Lincoln Six Echo
- Beiträge: 138
- Registriert: Di 26. Aug 2014, 16:42
- OS, Lazarus, FPC: Win10, Debian
- CPU-Target: I7/I9/Q9650/u.a.
- Wohnort: Hamburg
Re: DLLs als Windows-Plugin mit Lazarus
Die Schnittstellen sind umfassend dokumentiert, da gibt es keinerlei ungeklärtes.
Die DLLs sind alle 64Bit. Das seltsame ist ja das sie in vielen Anwendungen laufen und in einigen die verschiedensten Fehlermeldungen erzeugen. Heute habe ich noch einige weitere getestet, da bekomme ich u.a. die Fehlermeldung das das Plugin "nicht richtig installiert sei". Dabei gibt es da gar nichts zu installieren, es sind einfach nur einzelne Dateien die vom Host-Programm geladen werden. Bei vielen Doc's der Programme findet man die Erklärung man sollte das neue Plugin einfach in den entsprechenden Ordner kopieren.
Ich habe es auch umgekehrt gemacht, d.h. eine Host-Anwendung geschrieben und damit versucht meine und andere Plugins zu laden.
Bei einigen tritt eine Exception "Division durch 0" auf. Starte ich das Host-Programm "ohne Debugger starten" erhalte ich diesen Fehler bei diesen Plugins nicht mehr. Es muss also an Lazarus bzw. FPC liegen, denke ich.
Und Dank an af0815, den CFF Explorer habe ich mir sofort besorgt.
Die DLLs sind alle 64Bit. Das seltsame ist ja das sie in vielen Anwendungen laufen und in einigen die verschiedensten Fehlermeldungen erzeugen. Heute habe ich noch einige weitere getestet, da bekomme ich u.a. die Fehlermeldung das das Plugin "nicht richtig installiert sei". Dabei gibt es da gar nichts zu installieren, es sind einfach nur einzelne Dateien die vom Host-Programm geladen werden. Bei vielen Doc's der Programme findet man die Erklärung man sollte das neue Plugin einfach in den entsprechenden Ordner kopieren.
Ich habe es auch umgekehrt gemacht, d.h. eine Host-Anwendung geschrieben und damit versucht meine und andere Plugins zu laden.
Bei einigen tritt eine Exception "Division durch 0" auf. Starte ich das Host-Programm "ohne Debugger starten" erhalte ich diesen Fehler bei diesen Plugins nicht mehr. Es muss also an Lazarus bzw. FPC liegen, denke ich.
Und Dank an af0815, den CFF Explorer habe ich mir sofort besorgt.
-
- Beiträge: 962
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: DLLs als Windows-Plugin mit Lazarus
FPC (und auch Delphi) schaltet FPU Exceptions ein, da dies Object Pascal Code normal erwartet. C oder C++ rechnet nicht damit und daher kommt es dann zu Problemen, wenn dann eine entsprechende Exception im nicht-Object Pascal Code auftritt.Lincoln Six Echo hat geschrieben: Mi 5. Apr 2023, 20:46 Bei einigen tritt eine Exception "Division durch 0" auf. Starte ich das Host-Programm "ohne Debugger starten" erhalte ich diesen Fehler bei diesen Plugins nicht mehr. Es muss also an Lazarus bzw. FPC liegen, denke ich.
Welche FPC Version verwendest du? Es kann auch sein, dass die Programme nach den falschen Funktionsimporten suchen.Lincoln Six Echo hat geschrieben: Mi 5. Apr 2023, 11:21 Nun nehme ich aber so ein Megaprodukt und will mein Plugin darin laufen lassen. Programm A : Alles läuft so wie es soll. Programm B: dito. Programm C aber meldet es sei eine 32bit DLL die nicht mehr unterstützt wird. Programm D hängt sich ohne weitere Fehlermeldung auf und Programm E verkündet per Bildschirm-Dialog die entsprechende DLL sei keine korrekte Windows 64 DLL.
FPC Compiler Entwickler
- Lincoln Six Echo
- Beiträge: 138
- Registriert: Di 26. Aug 2014, 16:42
- OS, Lazarus, FPC: Win10, Debian
- CPU-Target: I7/I9/Q9650/u.a.
- Wohnort: Hamburg
Re: DLLs als Windows-Plugin mit Lazarus
Die IDE ist 2.2.2, FPC ist 3.2.2
Ich habe hier viele Plugins von anderen Herstellern die beim Laden Exceptions auslösen. Die lassen sich aber auch ganz ohne Abstürze behandeln obwohl diese Plugins in C++ mit VC geschrieben wurden.
Genau genommen treten die Fehler auch nicht beim Laden auf, also ich meine z.B.
h := dynlibs.loadlibrary(filename)
Das geht alles fehlerfrei. Die Plugins stürzen ab sobald sie einen Window-Handle zugewiesen bekommen und es an die Darstellung des GUI geht.
Die meisten machen das alles fehlerfrei aber einige stürzen ab und teilweise das Host-Programm gleich mit.
Von einem Hersteller habe ich drei, die machen das alle. Nur wenn ich dem zugewiesenen TForm ein TPanel mit dem Align alTop gebe, laufen sie. Den Hersteller habe ich bereits mehrfach angeschrieben, bis heute keine Antwort.
Ich habe hier viele Plugins von anderen Herstellern die beim Laden Exceptions auslösen. Die lassen sich aber auch ganz ohne Abstürze behandeln obwohl diese Plugins in C++ mit VC geschrieben wurden.
Genau genommen treten die Fehler auch nicht beim Laden auf, also ich meine z.B.
h := dynlibs.loadlibrary(filename)
Das geht alles fehlerfrei. Die Plugins stürzen ab sobald sie einen Window-Handle zugewiesen bekommen und es an die Darstellung des GUI geht.
Die meisten machen das alles fehlerfrei aber einige stürzen ab und teilweise das Host-Programm gleich mit.
Von einem Hersteller habe ich drei, die machen das alle. Nur wenn ich dem zugewiesenen TForm ein TPanel mit dem Align alTop gebe, laufen sie. Den Hersteller habe ich bereits mehrfach angeschrieben, bis heute keine Antwort.