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.
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;
- Eine DLL haben / erstellen
- Speichern Sie die DLL in einer RES-Datei
- Haben BTMemoryModule-Implementierung.
- Holen Sie sich die DLL aus der Ressource und laden Sie sie direkt in den Speicher.
- Verwenden Sie BTMemoryModule-Methoden, um Prozeduren aus der DLL im Speicher auszuführen.
BTMemoryLoadLibary in Delphi 2009, 2010,...
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"