Raksta ideja - Marks E Sūnas
Rakstā par to, kā saglabāt DLL Delphi programmas exe failā kā resursam, paskaidrots, kā nosūtīt DLL ar Delphi lietojumprogrammas izpildfailu kā resursu.
Dinamisko saišu bibliotēkas satur dalāmu kodu vai resursus, tie nodrošina iespēju vairākām lietojumprogrammām koplietot vienu kopīgu rutīnas (vai resursa) kopiju.
Izmantojot resursu (.RES) faili, jūs varat iegult (un izmantot) skaņas failus, videoklipus, animācijas un vispārīgi jebkura veida bināros failus Delphi izpildāmajā failā.
DLL ielādēšana no atmiņas
ja DLL, kas glabājas RES, var izmantot, vispirms to nesaglabājot failu sistēmā (cietajā diskā)
Saskaņā ar rakstu Notiek DLL ielāde no atmiņas iesniedza Joahims Baučs, tas ir iespējams.
Lūk, kā Joahims izskata šo jautājumu: Noklusējuma Windows API funkcijas ārējo bibliotēku ielādēšanai programmā (LoadLibrary, LoadLibraryEx) darbojas tikai ar failiem failu sistēmā. Tāpēc nav iespējams ielādēt DLL no atmiņas. Bet dažreiz jums ir nepieciešama tieši šī funkcionalitāte (piemēram, jūs nevēlaties izplatīt daudz failu vai vēlaties apgrūtināt izjaukšanu). Biežākais šīs problēmas risinājums ir DLL vispirms ierakstīt pagaidu failā un no turienes importēt. Kad programma tiek pārtraukta, pagaidu fails tiek izdzēsts.
Kods minētajā rakstā ir C ++, nākamais solis bija to pārveidot par Delphi. Par laimi to jau ir izdarījis Martins Offenvangers (grāmatas Offenwanger) DSPlayer).
Atmiņas modulis autors: Martins Offenwangers ir paplašināta ar Delphi (un arī Lazarus) saderīga Joahima Bauča C ++ versija Atmiņas modulis 0.0.1. Pasta indekss satur pilnu MemoyModule Delphi avota kodu (BTMemoryModule.pas). Turklāt ir iekļauts Delphi un paraugs, lai parādītu, kā to izmantot.
Iekraušana DLL no resursiem no atmiņas
Ja demonstrācijas DLL tiek saglabāts kā resurss, izmantojot RC failu:
DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
sākt
ja 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) tad
sākt
rs: = TResourceStream. Izveidot (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Izveidot;
mēģiniet
jaunkundze. LoadFromStream (rs);
jaunkundze. Pozīcija: = 0;
m_DllDataSize: = ms. Izmērs;
mp_DllData: = GetMemory (m_DllDataSize);
jaunkundze. Lasīt (mp_DllData ^, m_DllDataSize);
beidzot
jaunkundze. Bezmaksas;
rs. Bezmaksas;
beigas;
beigas;
beigas;
var
btMM: PBTMemoryModule;
sākt
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
mēģiniet
ja btMM = nulletad Pārtraukt;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
ja @m_TestCallstd = nulle, tad pārtraukt;
m_TestCallstd ('Šis ir Dll atmiņas zvans!');
izņemot
Showmessage ('Notiek kļūda, ielādējot dll:' + BTMemoryGetLastError);
beigas;
ja Piešķirts (btMM) tad BTMemoryFreeLibrary (btMM);
beigas;
- Ir / izveidojiet DLL
- Saglabājiet DLL RES failā
- Ir BTMemoryModule ieviešana.
- Satveriet DLL no resursa un ielādējiet to tieši atmiņā.
- Izmantojiet BTMemoryModule metodes, lai izpildītu procedūru no atmiņā esošā DLL.
BTMemoryLoadLibary Delphi 2009., 2010.,...
Es pirms kāda laika atradu līdzīgu faila BTMemoryModule.pas versiju un veicu izmaiņas, lai tā darbotos ar (vismaz) Delphi 2006, 2007 un 2009. Mana atjauninātā BTMemoryModule.pas un projekta paraugs atrodas plkst BTMemoryLoadLibary for Delphi> = 2009"