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).
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.
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;