4 Stimmen

Problem beim Starten des Programms mit einer als Ressource eingebetteten DLL

Ich habe den About.com-Leitfaden zur Einbettung von DLLs in Delphi-EXE-Dateien ausprobiert, der zu funktionieren scheint, solange ich die DLL nicht tatsächlich als externe Funktion verwende. Gibt es einen Weg, um den verlinkten Code früher als in einer Einheit, die im Uses-Klausel referenziert ist, zum Laufen zu bringen?
Ich habe es versucht:

  • Genau das zu tun, was dieser Code sagt.
  • Diesen Code im Initialisierungsabschnitt des Formulars zu platzieren, das die Einheit verwendet, die die externen Funktionen verwendet.
  • Diesen Code im Initialisierungsabschnitt der Einheit zu platzieren, die die externen Funktionen verwendet.

Und mit externen Funktionen meine ich eine Funktion, die so aussieht:

function MyFunction: Integer; stdcall; external 'fundll.dll';

Das Problem, das ich habe, ist das übliche 'fundll.dll' kann nicht geladen werden (weil sie nicht im Verzeichnis ist). Zarkos Code funktioniert (ziemlich cool, er erstellt die dll in diesem Ordner), wenn der Code so weit kommt. Aber es stürzt einfach ab, bevor das Projekt überhaupt richtig in Gang kommt, wenn ich die externen Funktionen brauche.

6voto

mghie Punkte 31618

Sie können dies nicht mit externen Funktionen tun - verwenden Sie stattdessen LoadLibrary() und GetProcAddress() nach Extrahieren der DLL, dann sollte alles funktionieren.

Der Grund dafür ist, dass jeder Code nur nach der Auflösung aller Einstiegspunkte durch den Betriebssystem-Lader ausgeführt wird. So eine Art Hühner-und-Ei-Problem, wenn Sie so wollen.

4voto

jasonpenny Punkte 2979

Wenn Sie LoadLibrary() und GetProcAddress() verwenden möchten, sollten Sie bevorzugen, BTMemoryModule zu verwenden, mit dem Sie die DLL als Ressource eingebettet verwenden können, ohne sie auf dem Dateisystem zu speichern (was der Benutzer möglicherweise nicht kann, abhängig von der Sicherheit des Computers).

http://www.jasontpenny.com/blog/2009/05/01/using-dlls-stored-as-resources-in-delphi-programs/

3voto

Don Dickinson Punkte 6120

Wenn Sie eine Funktion darin aufrufen möchten, haben Sie zwei Möglichkeiten ...

1) Verwenden Sie einen exe/dll-Bundler anstelle der Ressourcenmethode. 2) Verlinken Sie nicht mit der Bibliothek mit der externen Style-Deklaration. Verwenden Sie stattdessen LoadLibrary, GetProcAddress usw., um die Funktion aufzurufen, die Sie aufrufen müssen.

Die Ressourcenmethode und die Deklaration der Funktion als extern werden nicht gemischt. Windows möchte Ihre exe mit der DLL im Speicher verknüpfen bevor Ihr Code ausgeführt wird, um die DLL zu extrahieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X