2009-04-29 3 views
3

Ich habe About.com guide to embedding dll's in Delphi EXE's getan, die scheint zu funktionieren, solange ich nicht wirklich die DLL als externe Funktion verwenden. Gibt es überhaupt einen Code, mit dem der Code, mit dem ich verlinkt habe, früher funktioniert als eine Unit, auf die in der uses-Klausel verwiesen wird?
Ich habe versucht:Problem Startprogramm mit einer DLL als Ressource eingebettet

  • tun genau das, was dieser Code sagt.
  • Platzieren Sie diesen Code im Initialisierungsabschnitt des Formulars, das die Einheit verwendet, die die externen Funktionen verwendet.
  • Platzieren Sie diesen Code im Initialisierungsabschnitt der Einheit, die die externen Funktionen verwendet.

Und durch externe Funktionen auf eine Funktion, die ich mich beziehe, die wie folgt aussieht:

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

Das Problem, das ich bin immer ist das übliche ‚fundll.dll‘ kann nicht geladen werden (weil es nicht in das Verzeichnis) . Zarkos Code funktioniert (ziemlich süß, es erstellt die DLL in diesem Ordner), wenn der Code so weit kommt. Aber es stürzt einfach ab, bevor das Projekt überhaupt in Gang kommt, wenn ich die externen Funktionen nutze, die ich brauche.

+0

Wenn Sie Funktionen von ihm anrufen, dann ist es keine „Ressourcen-DLL.“ Es ist eine DLL, die zufällig als Ressource eingebettet wurde. Eine Ressourcen-DLL ist eine Ressource, deren einziger Zweck es ist, Ressourcen zu halten. –

+0

Ich bin neugierig. Warum möchten Sie eine DLL in Ihre EXE-Datei einfügen? Das scheint mir den Zweck der Verwendung einer DLL zu besiegen. –

+1

Mason, Sie können ein eigenständiges Programm zum Verteilen haben und dennoch Funktionen aufrufen, für die Sie keine Quelle haben und daher nicht direkt in Ihre EXE kompilieren können. –

Antwort

3

wenn Sie eine Funktion in es nennen wollen, haben Sie zwei Möglichkeiten ...

1) verwenden, um eine exe/dll bundler statt der Ressource-Methode. 2) Verknüpfen Sie die Bibliothek nicht mit der externen Stildeklaration. Verwenden Sie stattdessen LoadLibrary, GetProcAddress usw., um auf die Funktion zu verweisen, die Sie aufrufen müssen.

die Ressourcenmethode und die Deklaration der Funktion als extern wird nicht gemischt. Windows will Ihre exe mit der DLL im Speicher verbinden vor Ihr Code läuft, um die DLL zu extrahieren.

6

Sie können dies mit externen Funktionen nicht tun - verwenden Loadlibrary() und GetProcAddress() stattdessen nach der DLL-Extraktion, und alles soll funktionieren.

Der Grund ist, dass jeder Code erst ausgeführt wird, nachdem alle Einstiegspunkte vom Betriebssystem-Loader aufgelöst wurden. Irgendwie ein Problem mit Huhn und Ei, wenn du so willst.