Učitajte DLL iz resursa izravno iz memorije

Ideja članka Marka E. Mahovina

U članku kako pohraniti DLL unutar exe datoteke programa Delphi kao resursa objašnjava kako poslati DLL sa izvršnom datotekom Delphi aplikacije kao resursom.

Dinamičke biblioteke veza sadrže kôd ili resurse koji se mogu podijeliti, pružaju mogućnost višestrukim aplikacijama da dijele jedinstvenu kopiju zajedničke rutine (ili resursa).

koristeći datoteke (.RES) datoteke, možete umetnuti (i koristiti) zvučne datoteke, videoisječke, animacije i općenito bilo koje vrste binarnih datoteka u izvršnom softveru Delphi.

Učitavanje DLL datoteka iz memorije

ako se DLL pohranjen u RES-u može koristiti bez prethodnog spremanja u datotečni sustav (tvrdi disk)

Prema članku Učitavanje DLL-a iz memorije Joachim Bauch, to je moguće.

Evo kako Joachim gleda na problem: Zadane Windows API funkcije za učitavanje vanjskih biblioteka u program (LoadLibrary, LoadLibraryEx) rade samo s datotekama u datotečnom sustavu. Stoga je nemoguće učitati DLL iz memorije. No ponekad vam je potrebna upravo ova funkcionalnost (npr. Ne želite distribuirati puno datoteka ili želite otežati rastavljanje). Najčešća rješenja ovih problema su prvo napisati DLL u privremenu datoteku i uvoziti je odatle. Kada se program zaustavi, privremena se datoteka briše.

instagram viewer

Kod u navedenom članku je C ++, sljedeći korak je bio pretvoriti ga u Delphi. Srećom, to je već učinio Martin Offenwanger (autor knjige DSPlayer).

Memorijski modul Martin Offenwanger je proširena verzija Delphija (i također Lazarus) kompatibilne verzije C ++ Joachima Baucha Memorijski modul 0.0.1. Paket zip uključuje kompletni Delphi izvorni kod MemoyModule (BTMemoryModule.pas). Nadalje, tu je i Delphi i uzorak koji pokazuje kako ga koristiti.

Učitavanje DLL-ova iz resursa iz memorije

Ako se demo DLL pohranjuje kao resurs pomoću RC datoteke:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
početi
ako 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) zatim
početi
rs: = TResourceStream. Stvori (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Stvoriti;
probati
ms. LoadFromStream (rs);
ms. Pozicija: = 0;
m_DllDataSize: = ms. Veličina;
mp_DllData: = GetMemory (m_DllDataSize);
ms. Pročitajte (mp_DllData ^, m_DllDataSize);
konačno
ms. Besplatno;
rs. Besplatno;
kraj;
kraj;
kraj;
var
btMM: PBTMemoryModule;
početi
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
probati
ako je btMM = nulazatim Prekid;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
ako je @m_TestCallstd = nil, onda odustani;
m_TestCallstd ('Ovo je poziv za memoriju Dll!');
osim
Showmessage ('Došlo je do pogreške prilikom učitavanja dll:' + BTMemoryGetLastError);
kraj;
ako Dodijeljeno (btMM) zatim BTMemoryFreeLibrary (btMM);
kraj;
  1. Imati / stvoriti DLL
  2. Spremite DLL u RES datoteku
  3. Imati Implementacija BTMemoryModula.
  4. Uzmite DLL iz resursa i učitajte ga izravno u memoriju.
  5. Koristite metode BTMemoryModule da biste izvršili postupak iz DLL-a u memoriji.

BTMemoryLoadLibary u Delphiju 2009, 2010,...

"Povezani BTMemoryModule.pas ne radi s Delphijem 2009 (a pretpostavio bih i Delphi 2010).
Prije nekog vremena našao sam sličnu verziju datoteke BTMemoryModule.pas i izvršio promjene tako da surađuje sa (barem) Delphijem 2006, 2007 i 2009. Moja ažurirana BTMemoryModule.pas i primjer projekta su u BTMemoryLoadLibary za Delphi> = 2009"
instagram story viewer