Het artikel over het opslaan van een DLL in een exe-bestand van een Delphi-programma als een bron legt uit hoe een DLL met het uitvoerbare bestand van uw Delphi-toepassing als een bron kan worden verzonden.
Dynamische linkbibliotheken bevatten deelbare code of bronnen, ze bieden de mogelijkheid voor meerdere applicaties om een enkele kopie van een routine (of bron) die ze gemeenschappelijk hebben te delen.
Met behulp van bronbestanden (.RES) kunt u geluidsbestanden, videoclips, animaties en meer in het algemeen elke vorm van binaire bestanden inbedden in een uitvoerbaar Delphi-bestand.
Volgens het artikel Laden van een DLL uit het geheugen van Joachim Bauch is dit mogelijk.
Hier is hoe Joachim naar het probleem kijkt: De standaard Windows API-functies voor het laden van externe bibliotheken in een programma (LoadLibrary, LoadLibraryEx) werken alleen met bestanden op het bestandssysteem. Het is daarom onmogelijk om een DLL uit het geheugen te laden. Maar soms hebt u precies deze functionaliteit nodig (u wilt bijvoorbeeld niet veel bestanden distribueren of het demonteren moeilijker maken). Veelvoorkomende oplossingen voor dit probleem zijn de DLL eerst in een tijdelijk bestand te schrijven en van daaruit te importeren. Wanneer het programma wordt beëindigd, wordt het tijdelijke bestand verwijderd.
De code in het genoemde artikel is C ++, de volgende stap was om het te converteren naar Delphi. Gelukkig is dit al gedaan door Martin Offenwanger (de auteur van DSPlayer).
Memory Module van Martin Offenwanger is een uitgebreide Delphi (en ook Lazarus) compatibele versie van Joachim Bauch's C ++ Memory Module 0.0.1. Het zip-pakket bevat de volledige Delphi-broncode van de MemoyModule (BTMemoryModule.pas). Verder is er een Delphi en een voorbeeld meegeleverd om te demonstreren hoe het te gebruiken.
Als een demo-DLL wordt opgeslagen als een bron met behulp van het RC-bestand:
DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
beginnen
als 0 FindResource (hInstance, 'DemoDLL', RT_RCDATA) vervolgens
beginnen
rs: = TResourceStream.Create (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream.Create;
proberen
ms.LoadFromStream (rs);
mevrouw Positie: = 0;
m_DllDataSize: = reblogSize;
mp_DllData: = GetMemory (m_DllDataSize);
mevrouw.Lees (mp_DllData ^, m_DllDataSize);
Tenslotte
ms.Free;
rs.Free;
einde;
einde;
einde;
var
btMM: PBTMemoryModule;
beginnen
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
proberen
als btMM = nul vervolgens Afbreken;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
als @m_TestCallstd = nihil dan Afbreken;
m_TestCallstd ('Dit is een Dll Memory-oproep!');
behalve
Showmessage ('Er is een fout opgetreden tijdens het laden van de dll:' + BTMemoryGetLastError);
einde;
als Toegewezen (btMM) vervolgens BTMemoryFreeLibrary (btMM);
einde;