Laadige DLL ressursist otse mälust

Artikli idee autor: Mark E. Moss

Artiklis, kuidas salvestada DLL Delphi programmi exe-failis ressursina, selgitatakse, kuidas saata DLL koos Delphi rakenduse käivitatava failiga ressursina.

Dünaamiliste linkide teegid sisaldavad jagatavat koodi või ressursse, võimaldavad mitmel rakendusel jagada ühist rutiini (või ressursi) ühte eksemplari.

Kasutades ressursifailid (.RES), saate Delphi käivitatavasse faili manustada (ja kasutada) helifaile, videoklippe, animatsioone ja üldiselt mis tahes tüüpi binaarfaile.

DLL-ide laadimine mälust

kui RES-is salvestatud DLL-i saab kasutada ilma seda failisüsteemi (kõvakettale) salvestamata

Vastavalt artiklile DLL-i laadimine mälust autor Joachim Bauch, see on võimalik.

Joachim näeb seda küsimust järgmiselt: Windowsi vaikeseadete vaikefunktsioonid väliste raamatukogude laadimiseks programmi (LoadLibrary, LoadLibraryEx) töötavad ainult failisüsteemi failidega. Seetõttu on DLL-i mälust laadimine võimatu. Kuid mõnikord vajate just seda funktsionaalsust (nt te ei soovi levitada palju faile või soovite lahtivõtmist raskendada). Levinumad selle probleemi lahendamise viisid on DLL-faili ajutisse faili kirjutamine ja sealt importimine. Kui programm lõpeb, kustutatakse ajutine fail.

instagram viewer

Mainitud artikli kood on C ++, järgmine samm oli selle teisendamine Delphiks. Õnneks on seda juba teinud Martin Offenwanger (raamatu autor) DSP-kiht).

Mälumoodul autor Martin Offenwanger on laiendatud Delphi (ja ka Lazaruse) ühilduv versioon Joachim Bauchi C ++ versioonist Mälumoodul 0.0.1. ZIP-pakett sisaldab MemoyModule'i täielikku Delphi lähtekoodi (BTMemoryModule.pas). Lisaks on kaasas Delphi ja näidis, mis demonstreerivad selle kasutamist.

DLL-ide laadimine ressurssidest mälust

Kui demo-DLL salvestatakse RC-faili kasutades ressursina:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
alustada
kui 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) siis
alustada
rs: = TResourceStream. Loo (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Loo;
proovida
Prl. LoadFromStream (rs);
Prl. Asend: = 0;
m_DllDataSize: = ms. Suurus;
mp_DllData: = GetMemory (m_DllDataSize);
Prl. Loe (mp_DllData ^, m_DllDataSize);
lõpuks
Prl. Tasuta;
rs. Tasuta;
lõpp;
lõpp;
lõpp;
var
btMM: PBTMemoryModule;
alustada
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
proovida
kui btMM = nullsiis Katkesta;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
kui @m_TestCallstd = null, siis Katkesta;
m_TestCallstd ('See on DLL-mälu kõne!');
välja arvatud
Showmessage ('Dlli laadimisel ilmnes viga:' + BTMemoryGetLastError);
lõpp;
kui Määratud (btMM) siis BTMemoryFreeLibrary (btMM);
lõpp;
  1. Kas olete / looge DLL
  2. Salvestage DLL RES-faili
  3. On BTMemoryModule rakendamine.
  4. Haara ressursist DLL ja laadige see otse mällu.
  5. Protseduuri teostamiseks mälust DLL-ist saate kasutada BTMemoryModule meetodeid.

BTMemoryLoadLibary Delphis 2009, 2010,...

"Lingitud BTMemoryModule.pas ei tööta Delphi 2009-ga (ja ma eeldaksin ka Delphi 2010).
Leidsin mõni aeg tagasi faili BTMemoryModule.pas sarnase versiooni ja tegin muudatused, nii et see töötab (vähemalt) Delphi 2006, 2007 ja 2009 versiooniga. Minu värskendatud BTMemoryModule.pas ja näidisprojekt asuvad aadressil BTMemoryLoadLibary Delphi jaoks> = 2009"
instagram story viewer