Töltsön be egy DLL-t egy erőforrásból közvetlenül a memóriából

Cikk ötlete: Mark E. Moha

A DLL tárolása a Delphi program exe fájljában erőforrásként című cikkben elmagyarázza, hogyan kell a DLL-t a Delphi alkalmazás végrehajtható fájljával erőforrásként szállítani.

Dinamikus link könyvtárak megosztható kódot vagy erőforrásokat tartalmaznak, lehetővé teszik, hogy több alkalmazás megoszthassa a közös rutin (vagy erőforrás) egyetlen példányát.

használata erőforrás (.RES) fájlok, hangfájlokat, videoklipeket, animációkat és általánosságban bármilyen bináris fájlt beágyazhat (és használhat) egy Delphi végrehajtható fájlba.

A DLL fájlok betöltése a memóriából

ha a RES-ben tárolt DLL felhasználható anélkül, hogy először mentenék a fájlrendszerre (merevlemezre)

A cikk szerint A DLL betöltése a memóriából Joachim Bauch készítette, ez lehetséges.

Joachim így néz ki a kérdésben: Az alapértelmezett Windows API funkciók a külső könyvtárak programba történő betöltésére (LoadLibrary, LoadLibraryEx), csak a fájlrendszer fájljaival működnek. Ezért lehetetlen betölteni a DLL memóriából. De néha pontosan erre a funkcióra van szüksége (pl. Nem akar sok fájlt elosztani, vagy megnehezíti a szétszerelést). Ennek a problémának a leggyakoribb megoldása az, ha először a DLL-t ideiglenes fájlba írja, és onnan importálja. Amikor a program leáll, az ideiglenes fájl törlődik.

instagram viewer

Az említett cikk kódja C ++, a következő lépés az volt, hogy átalakítsuk Delphi-re. Szerencsére ezt már Martin Offenwanger (a DSPlayer).

Memória modul Martin Offenwanger által készített Joachim Bauch C ++ kibővített Delphi (és Lazarus) kompatibilis verziója Memória modul 0.0.1. A ZIP-csomag a MemoyModule teljes Delphi forráskódját tartalmazza (BTMemoryModule.pas). Ezenkívül mellékelünk egy Delphi-t és mintát annak bemutatására.

A DLL fájlok betöltése a memória forrásaiból

Ha egy demo DLL erőforrásként van tárolva az RC fájl használatával:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
kezdődik
ha 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) azután
kezdődik
rs: = TResourceStream. Létrehozás (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. létrehozása;
próbáld ki
Kisasszony. LoadFromStream (rs);
Kisasszony. Pozíció: = 0;
m_DllDataSize: = ms. Méret;
mp_DllData: = GetMemory (m_DllDataSize);
Kisasszony. Olvassa el (mp_DllData ^, m_DllDataSize);
végül
Kisasszony. Ingyenes;
rs. Ingyenes;
vég;
vég;
vég;
var
btMM: PBTMemoryModule;
kezdődik
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
próbáld ki
ha btMM = nullaazután Elvetél;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
ha @m_TestCallstd = nulla, akkor megszakítja;
m_TestCallstd ('Ez egy Dll memória hívás!');
kivéve
Showmessage ('Hiba történt a dll betöltésekor:' + BTMemoryGetLastError);
vég;
ha Hozzárendelt (btMM) azután BTMemoryFreeLibrary (btMM);
végén;
  1. Van / hozzon létre egy DLL-t
  2. Tárolja a DLL-t egy RES fájlban
  3. Saját BTMemoryModule megvalósítása.
  4. Fogja meg a DLL-t az erőforrásból, és töltse be közvetlenül a memóriába.
  5. Használja a BTMemoryModule metódusokat az eljárás végrehajtásához a memóriában lévő DLL-ből.

BTMemoryLoadLibary Delphi-ben, 2009, 2010,...

"A kapcsolt BTMemoryModule.pas nem működik a Delphi 2009-rel (és feltételezem, hogy a Delphi 2010 is).
Találtam egy hasonló verziót a BTMemoryModule.pas fájlnak egy ideje, és módosítottam, így működik (legalább) a Delphi 2006, 2007 és 2009-rel. A frissített BTMemoryModule.pas és egy mintaprojekt itt található: BTMemoryLoadLibary Delphi-hez> = 2009"
instagram story viewer