Laad een DLL vanuit een bron rechtstreeks vanuit het geheugen in Delphi-toepassingen

Artikelidee door Mark E. Moss

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.

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

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.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;
  1. Heb / Creëer een DLL
  2. Sla de DLL op in een RES-bestand
  3. Zorg voor BTMemoryModule-implementatie.
  4. Pak de DLL uit de bron en laad deze rechtstreeks in het geheugen.
  5. Gebruik BTMemoryModule-methoden om de procedure uit te voeren vanaf de DLL in het geheugen.

BTMemoryLoadLibary in Delphi 2009, 2010,…

"De gekoppelde BTMemoryModule.pas werkt niet met Delphi 2009 (en ik neem aan dat Delphi 2010 ook).
Ik heb een tijdje 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 "