Įkelkite DLL iš šaltinio tiesiai iš atminties

Straipsnio idėja - Markas E. Samanos

Straipsnyje, kaip saugoti DLL „Delphi“ programos exe faile kaip šaltinį, paaiškinama, kaip išsiųsti DLL su „Delphi“ programos vykdomuoju failu kaip šaltinį.

Dinaminių nuorodų bibliotekos kuriuose yra bendrinamas kodas ar šaltiniai, jie suteikia galimybę kelioms programoms dalytis viena bendra įprastos įprastos programos (arba išteklių) kopija.

Naudojant išteklių (.RES) failai, į „Delphi“ vykdomąją programą galite įterpti (ir naudoti) garso failus, vaizdo įrašus, animaciją ir apskritai bet kokius dvejetainius failus.

Įkeliama DLL iš atminties

jei RES saugomą DLL galima naudoti iš anksto neišsaugant failų sistemoje (standžiajame diske)

Pagal straipsnį Įkeliama DLL iš atminties pateikė Joachim Bauch, tai įmanoma.

Štai, kaip Joachimas žvelgia į problemą: Numatytosios „Windows“ API funkcijos išorinėms bibliotekoms įkelti į programą („LoadLibrary“, „LoadLibraryEx“) veikia tik su rinkmenomis failų sistemoje. Todėl neįmanoma įkelti DLL iš atminties. Bet kartais jums reikia būtent šios funkcijos (pvz., Nenorite platinti daug failų ar norite apsunkinti išmontavimą). Bendri šios problemos sprendimo būdai yra pirmiausia įrašyti DLL į laikinąjį failą ir jį importuoti iš ten. Kai programa baigsis, laikinasis failas bus ištrintas.

instagram viewer

Kodas minėtame straipsnyje yra C ++, kitas žingsnis buvo konvertuoti jį į Delphi. Laimei, tai jau padarė Martinas Offenwangeris ( DSPlayer).

Atminties modulis Martin Offenwanger yra išplėstinė „Delphi“ (taip pat „Lazarus“) suderinama Joachimo Baucho C ++ versija Atminties modulis 0.0.1. Pašto paketą sudaro visas MemoyModule Delphi šaltinio kodas („BTMemoryModule.pas“). Be to, pridedamas „Delphi“ ir pavyzdys, parodantis, kaip juo naudotis.

Įkeliami DLL iš išteklių iš atminties

Jei demonstracinis DLL saugomas kaip šaltinis naudojant RC failą:

„DemoDLL RCDATA DemoDLL.dll“
var
ms: TMemoryStream;
rs: „TResourceStream“;
prasideda
jei 0 <> „FindResource“ („hInstance“, „DemoDLL“, RT_RCDATA) tada
prasideda
rs: = „TResourceStream“. Kurti („hInstance“, „DemoDLL“, RT_RCDATA);
ms: = TMemoryStream. Kurti;
bandyti
ms „LoadFromStream“ (rs);
ms Padėtis: = 0;
„m_DllDataSize“: = ms. Dydis;
mp_DllData: = GetMemory (m_DllDataSize);
ms Skaityti (mp_DllData ^, m_DllDataSize);
pagaliau
ms Laisvas;
rs. Laisvas;
galas;
galas;
galas;
var
btMM: PBTMemoryModule;
prasideda
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
bandyti
jei btMM = nulistada Nutraukti;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
jei @m_TestCallstd = nulis, tada nutraukti;
m_TestCallstd ('Tai yra Dll atminties skambutis!');
išskyrus
„Showmessage“ (Klaida, padaryta kraunant dll: '+ BTMemoryGetLastError);
galas;
jei Paskirtas (btMM) tada „BTMemoryFreeLibrary“ (btMM);
galas;
  1. Turėti / sukurti DLL
  2. Saugokite DLL RES faile
  3. Turi „BTMemoryModule“ įgyvendinimas.
  4. Paimkite DLL iš šaltinio ir įkelkite tiesiai į atmintį.
  5. Norėdami atlikti procedūrą iš atmintyje esančio DLL, naudokite „BTMemoryModule“ metodus.

„BTMemoryLoadLibary“ „Delphi“ 2009, 2010,...

„Susietas„ BTMemoryModule.pas “neveikia su„ Delphi 2009 “(ir aš manau, kad ir„ Delphi 2010 “).
Aš prieš kurį laiką radau panašią BTMemoryModule.pas failo versiją ir padariau pakeitimus, kad ji veiktų su (bent) „Delphi 2006“, 2007 ir 2009 m. Mano atnaujintas „BTMemoryModule.pas“ ir pavyzdinis projektas yra „BTMemoryLoadLibary“, skirta „Delphi“ = = 2009"