Artikelidee door Mark E. Mos
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 deelbare code of bronnen bevatten, bieden ze de mogelijkheid voor meerdere toepassingen om een enkele kopie van een routine (of bron) die ze gemeen hebben te delen.
Gebruik makend van resource (.RES) bestanden, kunt u geluidsbestanden, videoclips, animaties en meer in het algemeen elke vorm van binaire bestanden insluiten (en gebruiken) in een Delphi-uitvoerbaar bestand.
DLL's laden uit het geheugen
als een in een RES opgeslagen DLL kan worden gebruikt zonder deze eerst op te slaan op het bestandssysteem (harde schijf)
Volgens het artikel Een DLL uit het geheugen laden door Joachim Bauch, dit is 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).
Geheugenmodule door Martin Offenwanger is een uitgebreide Delphi (en ook Lazarus) compatibele versie van Joachim Bauch's C ++ Geheugenmodule 0.0.1. Het zip-pakket bevat de complete Delphi-broncode van de MemoyModule (BTMemoryModule.pas). Verder is er een Delphi en een voorbeeld meegeleverd om te demonstreren hoe het te gebruiken.
DLL's laden vanuit bronnen uit het geheugen
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. Maken (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Maken;
proberen
Mevr. LoadFromStream (rs);
Mevr. Positie: = 0;
m_DllDataSize: = ms. Grootte;
mp_DllData: = GetMemory (m_DllDataSize);
Mevr. Lees (mp_DllData ^, m_DllDataSize);
Tenslotte
Mevr. Vrij;
rs. Vrij;
einde;
einde;
einde;
var
btMM: PBTMemoryModule;
beginnen
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
proberen
als btMM = nihilvervolgens 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;
- Heb / Creëer een DLL
- Sla de DLL op in een RES-bestand
- Hebben BTMemoryModule implementatie.
- Pak de DLL uit de bron en laad deze rechtstreeks in het geheugen.
- Gebruik BTMemoryModule-methoden om de procedure uit te voeren vanaf de DLL in het geheugen.
BTMemoryLoadLibary in Delphi 2009, 2010,...
Ik heb een tijd geleden een vergelijkbare versie van het BTMemoryModule.pas-bestand gevonden en wijzigingen aangebracht zodat het werkt met (tenminste) Delphi 2006, 2007 en 2009. Mijn bijgewerkte BTMemoryModule.pas en een voorbeeldproject staan op BTMemoryLoadLibary voor Delphi> = 2009"