Laden Sie eine DLL aus einer Ressource direkt aus dem Speicher

click fraud protection

Artikelidee von Mark E. Moos

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

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

Verwenden von Ressourcendateien (.RES)Sie können Sounddateien, Videoclips, Animationen und allgemein 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

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

So sieht Joachim das Problem: Die Standardfunktionen der Windows-API 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 das Zerlegen erschweren). Häufige Problemumgehungen für diese Probleme 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.

instagram viewer

Der Code im genannten 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).

Speichermodul von Martin Offenwanger ist eine erweiterte Delphi (und auch Lazarus) kompatible Version von Joachim Bauch's C ++ Speichermodul 0.0.1. Das Zip-Paket enthält den vollständigen Delphi-Quellcode des MemoyModule (BTMemoryModule.pas). Darüber hinaus 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. Erstellen;
Versuchen
Frau. LoadFromStream (rs);
Frau. Position: = 0;
m_DllDataSize: = ms. Größe;
mp_DllData: = GetMemory (m_DllDataSize);
Frau. Read (mp_DllData ^, m_DllDataSize);
schließlich
Frau. Kostenlos;
rs. Kostenlos;
Ende;
Ende;
Ende;
var
btMM: PBTMemoryModule;
Start
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
Versuchen
wenn btMM = Nulldann Abbrechen;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
wenn @m_TestCallstd = nil, dann Abort;
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. Eine DLL haben / erstellen
  2. Speichern Sie die DLL in einer RES-Datei
  3. Haben BTMemoryModule-Implementierung.
  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,...

"Das verknüpfte 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 BTMemoryModule.pas und ein Beispielprojekt befinden sich unter BTMemoryLoadLibary für Delphi> = 2009"
instagram story viewer