Laden Sie eine DLL aus einer Ressource direkt aus dem Speicher in Delphi-Anwendungen

Artikelidee von Mark E. Moss

In dem Artikel zum Speichern einer DLL in einer Delphi-Programm-Exe-Datei als Ressource wird erläutert, wie Sie eine DLL mit Ihrer ausführbaren Delphi-Anwendungsdatei als Ressource ausliefern.

Dynamische Linkbibliotheken enthalten gemeinsam nutzbaren Code oder gemeinsam genutzte Ressourcen. Sie bieten mehreren Anwendungen die Möglichkeit, eine einzige Kopie einer gemeinsamen Routine (oder Ressource) gemeinsam zu nutzen.

Mithilfe von Ressourcendateien (.RES) können Sie Audiodateien, Videoclips, Animationen und allgemeiner jede Art von Binärdateien in eine ausführbare Delphi-Datei einbetten (und verwenden).

Laden von DLLs aus dem Speicher

wenn eine in einem RES gespeicherte DLL verwendet werden kann, ohne sie zuvor im Dateisystem (Festplatte) zu speichern

Laut dem Artikel Laden einer DLL aus dem Speicher von Joachim Bauch ist dies möglich.

So sieht Joachim das Thema aus: Die standardmäßigen Windows-API-Funktionen zum Laden externer Bibliotheken in ein Programm (LoadLibrary, LoadLibraryEx) funktionieren nur mit Dateien im Dateisystem. Es ist daher unmöglich, eine DLL aus dem Speicher zu laden. Manchmal benötigen Sie jedoch genau diese Funktionalität (z. B. möchten Sie nicht viele Dateien verteilen oder die Demontage erschweren). Übliche Problemumgehungen für dieses Problem bestehen darin, die DLL zuerst in eine temporäre Datei zu schreiben und von dort zu importieren. Wenn das Programm beendet wird, wird die temporäre Datei gelöscht.

Der Code in dem erwähnten Artikel ist C ++. Der nächste Schritt bestand darin, ihn in Delphi zu konvertieren. Zum Glück wurde dies bereits von Martin Offenwanger (dem Autor von DSPlayer) gemacht.

Memory Module von Martin Offenwanger ist eine erweiterte Delphi (und auch Lazarus) -kompatible Version von Joachim Bauch's C ++ Memory Module 0.0.1. Das zip-Paket enthält den vollständigen Delphi-Quellcode des MemoyModule (BTMemoryModule.pas). Außerdem sind ein Delphi und ein Beispiel enthalten, um die Verwendung zu demonstrieren.

Laden von DLLs aus Ressourcen aus dem Speicher

Wenn eine Demo-DLL mithilfe der RC-Datei als Ressource gespeichert wird:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
Start
wenn 0 FindResource (hInstance, 'DemoDLL', RT_RCDATA) dann
Start
rs: = TResourceStream.Create (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream.Create;
Versuchen
ms.LoadFromStream (rs);
ms.Position: = 0;
m_DllDataSize: = ms.Size;
mp_DllData: = GetMemory (m_DllDataSize);
ms.Read (mp_DllData ^, m_DllDataSize);
schließlich
ms.Free;
rs.Free;
Ende;
Ende;
Ende;
var
btMM: PBTMemoryModule;
Start
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
Versuchen
wenn btMM = Null dann Abbrechen;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
wenn @m_TestCallstd = nil, dann Abbrechen;
m_TestCallstd ('Dies ist ein DLL-Speicheraufruf!');
außer
Showmessage ('Beim Laden der DLL ist ein Fehler aufgetreten:' + BTMemoryGetLastError);
Ende;
wenn Zugewiesen (btMM) dann BTMemoryFreeLibrary (btMM);
Ende;
  1. Habe / Erstelle eine DLL
  2. Speichern Sie die DLL in einer RES-Datei
  3. Implementierung von BTMemoryModule.
  4. Holen Sie sich die DLL aus der Ressource und laden Sie sie direkt in den Speicher.
  5. Verwenden Sie BTMemoryModule-Methoden, um Prozeduren aus der DLL im Speicher auszuführen.

BTMemoryLoadLibary in Delphi 2009, 2010,…

"Die verknüpfte Datei BTMemoryModule.pas funktioniert nicht mit Delphi 2009 (und ich würde auch Delphi 2010 annehmen).
Ich habe vor einiger Zeit eine ähnliche Version der Datei BTMemoryModule.pas gefunden und Änderungen vorgenommen, damit sie mit (mindestens) Delphi 2006, 2007 und 2009 funktioniert. Meine aktualisierte Datei BTMemoryModule.pas und ein Beispielprojekt befinden sich unter BTMemoryLoadLibary for Delphi> = 2009 "