Članek ideja avtorja Mark E. Mah
V članku, kako shraniti DLL v datoteko exe programa Delphi kot vir, je razloženo, kako odpreti DLL z izvršljivo datoteko aplikacije Delphi.
Dinamične knjižnice povezav vsebujejo skupno kodo ali vire, omogočajo več aplikacijam, da si delijo en izvod skupne rutine (ali vira).
Uporaba datoteke (.RES)lahko v Delphi izvedljiv vdelate (in uporabite) zvočne datoteke, video posnetke, animacije in na splošno vse vrste dvojiških datotek.
Nalaganje DLL-jev iz pomnilnika
če je DLL, shranjen v OVE, mogoče uporabiti, ne da bi ga predhodno shranili v datotečni sistem (trdi disk)
Glede na članek Nalaganje DLL-ja iz pomnilnika Joachim Bauch, to je mogoče.
Evo, kako Joachim gleda na to vprašanje: Privzete funkcije programa Windows API za nalaganje zunanjih knjižnic v program (LoadLibrary, LoadLibraryEx) delujejo samo z datotekami v datotečnem sistemu. Zato ni mogoče naložiti DLL iz pomnilnika. Včasih pa potrebujete prav to funkcijo (npr. Ne želite distribuirati veliko datotek ali želite razstaviti težje). Najpogostejša rešitev teh težav je, da DLL najprej zapišete v začasno datoteko in jo uvozite od tam. Ko program preneha, se začasna datoteka izbriše.
Koda v omenjenem članku je C ++, naslednji korak je bila pretvorba v Delphi. Na srečo je to že storil Martin Offenwanger (avtor DSPlayer).
Pomnilniški modul avtor Martin Offenwanger je razširjena različica Delphi (in tudi Lazarus) združljiva različica C ++ Joachima Baucha Pomnilniški modul 0.0.1. Paket zip vključuje celotno izvorno kodo Delphi v MemoyModule (BTMemoryModule.pas). Poleg tega je na voljo Delphi in vzorec, ki prikazujeta, kako ga uporabljati.
Nalaganje DLL-jev iz virov iz pomnilnika
Če je demo DLL shranjen kot vir z uporabo datoteke RC:
DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
začeti
če 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) torej
začeti
rs: = TResourceStream. Ustvari (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Ustvari;
poskusi
gospa. LoadFromStream (rs);
gospa. Položaj: = 0;
m_DllDataSize: = ms. Velikost;
mp_DllData: = GetMemory (m_DllDataSize);
gospa. Branje (mp_DllData ^, m_DllDataSize);
končno
gospa. Prost;
rs. Prost;
konec;
konec;
konec;
var
btMM: PBTMemoryModule;
začeti
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
poskusi
če je btMM = ničtorej Prekini;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
če je @m_TestCallstd = nič, potem prekini;
m_TestCallstd ("To je klic pomnilnika Dll!");
razen
Showmessage ('Pri nalaganju dll je prišlo do napake:' + BTMemoryGetLastError);
konec;
če Dodeljeno (btMM) torej BTMemoryFreeLibrary (btMM);
konec;
- Imej / ustvari DLL
- DLL shranite v datoteko OVE
- Imej Izvedba BTMemoryModule.
- Zgrabite DLL iz vira in ga naložite neposredno v pomnilnik.
- Uporabite metode BTMemoryModule za izvajanje postopka iz pomnilnika DLL.
BTMemoryLoadLibary v Delphiju 2009, 2010,...
Pred časom sem našel podobno različico datoteke BTMemoryModule.pas in spremenil spremembe, tako da deluje z (vsaj) Delphiji 2006, 2007 in 2009. Moja posodobljena BTMemoryModule.pas in vzorčni projekt sta na BTMemoryLoadLibary za Delphi> = 2009"