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.
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;
- Turėti / sukurti DLL
- Saugokite DLL RES faile
- Turi „BTMemoryModule“ įgyvendinimas.
- Paimkite DLL iš šaltinio ir įkelkite tiesiai į atmintį.
- Norėdami atlikti procedūrą iš atmintyje esančio DLL, naudokite „BTMemoryModule“ metodus.
„BTMemoryLoadLibary“ „Delphi“ 2009, 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"