Načítať DLL zo zdroja priamo z pamäte

Myšlienka článku od Marka E. mach

Článok, ako uložiť DLL do exe súboru programu Delphi ako prostriedok, vysvetľuje, ako sa má dodávať knižnica DLL so spustiteľným súborom aplikácie Delphi ako prostriedok.

Knižnice dynamických odkazov obsahujú zdieľateľný kód alebo zdroje, poskytujú viacerým aplikáciám možnosť zdieľať jednu kópiu rutiny (alebo zdroja), ktorú majú spoločné.

Použitím súbory zdrojov (.RES), môžete do spustiteľného súboru Delphi vložiť (a používať) zvukové súbory, videoklipy, animácie a všeobecnejšie akékoľvek binárne súbory.

Načítanie DLL z pamäte

ak sa dá DLL uložená v RES použiť bez jej uloženia na súborový systém (pevný disk)

Podľa toho článku Načítanie DLL z pamäte Joachim Bauch, je to možné.

Tu je návod, ako sa Joachim venuje tejto záležitosti: Predvolené funkcie rozhrania API systému Windows na načítanie externých knižníc do programu (LoadLibrary, LoadLibraryEx) fungujú iba so súbormi v súborovom systéme. Preto nie je možné načítať DLL z pamäte. Niekedy však potrebujete presne túto funkciu (napr. Nechcete distribuovať veľa súborov alebo nechcete rozobrať zložitejšie). Bežným riešením týchto problémov je najprv zapísať DLL do dočasného súboru a odtiaľ ju importovať. Po ukončení programu sa dočasný súbor odstráni.

instagram viewer

Kód v uvedenom článku je C ++, ďalším krokom bolo jeho prevedenie na Delphi. Našťastie to už urobil Martin Offenwanger (autor knihy DSPlayer).

Pamäťový modul od Martina Offenwangera je rozšírená verzia Delphi (a tiež Lazarus) kompatibilná s C ++ Joachima Baucha Pamäťový modul 0.0.1. Balík zip obsahuje kompletný zdrojový kód Delphi MemoyModule (BTMemoryModule.pas). Ďalej je tu Delphi a vzorka, ktorá demonštruje, ako ju používať.

Načítanie DLL z prostriedkov z pamäte

Ak je ukážka DLL uložená ako prostriedok pomocou súboru RC:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
začať
ak 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) potom
začať
rs: = TResourceStream. Vytvoriť (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. vytvorenie;
vyskúšať
pani. LoadFromStream (rs);
pani. Pozícia: = 0;
m_DllDataSize: = ms. veľkosť;
mp_DllData: = GetMemory (m_DllDataSize);
pani. Čítať (mp_DllData ^, m_DllDataSize);
konečne
pani. Zadarmo;
rs. Zadarmo;
koniec;
koniec;
koniec;
var
btMM: PBTMemoryModule;
začať
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
vyskúšať
ak btMM = nulapotom abort;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
ak @ m_TestCallstd = nula, potom prerušiť;
m_TestCallstd ('Toto je volanie do Dll Memory!');
leč
Showmessage ('Pri načítavaní dll sa vyskytla chyba:' + BTMemoryGetLastError);
koniec;
ak Priradené (btMM) potom BTMemoryFreeLibrary (btMM);
koniec;
  1. Have / Create DLL
  2. Uložte DLL do súboru RES
  3. Have Implementácia BTMemoryModule.
  4. Získajte DLL zo zdroja a nahrajte ho priamo do pamäte.
  5. Na vykonávanie postupu z knižnice DLL v pamäti použite metódy BTMemoryModule.

BTMemoryLoadLibary v Delphi 2009, 2010,...

„Prepojený súbor BTMemoryModule.pas nefunguje s programom Delphi 2009 (a predpokladal by som aj program Delphi 2010).
Pred chvíľou som našiel podobnú verziu súboru BTMemoryModule.pas a vykonal som zmeny, aby fungoval (aspoň) s Delphi 2006, 2007 a 2009. Moje aktualizované BTMemoryModule.pas a ukážkový projekt sú na stránke BTMemoryLoadLibary for Delphi> = 2009"