Last en DLL fra en ressurs direkte fra minnet

Artikkelidé av Mark E. Mose

Artikkelen om hvordan du lagrer en DLL i en exe-fil fra Delphi-programmet som en ressurs, forklarer hvordan du sender en DLL med den kjørbare filen Delphi-applikasjonen som en ressurs.

Dynamiske lenke biblioteker inneholder delbar kode eller ressurser, gir de muligheten for flere applikasjoner å dele en enkelt kopi av en rutine (eller ressurs) de har til felles.

Ved hjelp av ressursfiler (.RES), kan du legge inn (og bruke) lydfiler, videoklipp, animasjoner og mer generelt alle slags binære filer i en Delphi-kjørbar.

Laster inn DLL-er fra minnet

hvis en DLL lagret i en RES kan brukes uten først å lagre den på filsystemet (harddisk)

Ifølge artikkelen Laster inn en DLL fra minnet av Joachim Bauch, dette er mulig.

Slik ser Joachim på problemet: Standard windows API-funksjoner for å laste eksterne biblioteker i et program (LoadLibrary, LoadLibraryEx) fungerer bare med filer på filsystemet. Det er derfor umulig å laste en DLL fra minnet. Men noen ganger trenger du nøyaktig denne funksjonaliteten (f.eks. Vil du ikke distribuere mange filer eller vil gjøre demontering vanskeligere). Vanlige løsninger for disse problemene er å skrive DLL inn i en midlertidig fil først og importere den derfra. Når programmet avsluttes, blir den midlertidige filen slettet.

instagram viewer

Koden i den nevnte artikkelen er C ++, neste trinn var å konvertere den til Delphi. Heldigvis har dette allerede blitt gjort av Martin Offenwanger (forfatteren av DSPlayer).

Minnemodul av Martin Offenwanger er en utvidet Delphi (og også Lazarus) kompatibel versjon av Joachim Bauchs C ++ Minnemodul 0.0.1. Zip-pakken inkluderer den komplette Delphi-kildekoden til MemoyModule (BTMemoryModule.pas). Videre er det en Delphi og prøve inkludert for å demonstrere hvordan du bruker den.

Laster inn DLL-er fra ressurser fra minne

Hvis en demo-DLL er lagret som en ressurs ved å bruke RC-filen:

DemoDLL RCDATA DemoDLL.dll
Var
ms: TMemoryStream;
rs: TResourceStream;
begynne
hvis 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) deretter
begynne
rs: = TResourceStream. Opprett (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Skape;
prøve
ms. LoadFromStream (rs);
ms. Posisjon: = 0;
m_DllDataSize: = ms. Størrelse;
mp_DllData: = GetMemory (m_DllDataSize);
ms. Les (mp_DllData ^, m_DllDataSize);
endelig
ms. Gratis;
rs. Gratis;
slutt;
slutt;
slutt;
Var
btMM: PBTMemoryModule;
begynne
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
prøve
hvis btMM = nilderetter Avbryte;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
hvis @m_TestCallstd = null, avbryt;
m_TestCallstd ('Dette er et Dll-minne-anrop!');
unntatt
Showmessage ('Det oppsto en feil under innlasting av dll:' + BTMemoryGetLastError);
slutt;
hvis Tildelt (btMM) deretter BTMemoryFreeLibrary (btMM);
slutt;
  1. Har / Opprett en DLL
  2. Lagre DLL i en RES-fil
  3. Ha BTMemoryModule implementering.
  4. Ta tak i DLL fra ressursen og last den direkte i minnet.
  5. Bruk BTMemoryModule metoder for å utføre prosedyre fra DLL i minnet.

BTMemoryLoadLibary i Delphi 2009, 2010,...

"Den koblede BTMemoryModule.pas fungerer ikke med Delphi 2009 (og jeg vil anta Delphi 2010 også).
Jeg fant en lignende versjon av BTMemoryModule.pas-filen for en stund siden, og gjorde endringer slik at den fungerer med (minst) Delphi 2006, 2007 og 2009. Min oppdaterte BTMemoryModule.pas, og et eksempelprosjekt, er på BTMemoryLoadLibary for Delphi> = 2009"