Încărcați un DLL dintr-o resursă direct din memorie

click fraud protection

Ideea articolului de Mark E. mușchi

Articolul cum să stochezi un DLL în fișierul exe al programului Delphi ca resursă explică modul de livrare a unui DLL cu fișierul executabil al aplicației Delphi ca resursă.

Bibliotecile de legături dinamice contin cod sau resurse care pot fi ras, ofera posibilitatea ca mai multe aplicatii sa partajeze o singura copie a unei rutine (sau resurse) pe care le au in comun.

Utilizarea fișiere resursă (.RES), puteți încorpora (și utiliza) fișiere de sunet, clipuri video, animații și, în general, orice fel de fișiere binare într-un executabil Delphi.

Încărcarea DLL-urilor din memorie

dacă o DLL stocată într-un RES poate fi utilizată fără a o salva mai întâi pe sistemul de fișiere (hard disk)

Conform articolului Se încarcă un DLL din memorie de Joachim Bauch, acest lucru este posibil.

Iată cum arată Joachim la problema: Funcțiile implicite API API pentru încărcarea bibliotecilor externe într-un program (LoadLibrary, LoadLibraryEx) funcționează numai cu fișierele din sistemul de fișiere. Prin urmare, este imposibil să încărcați un DLL din memorie. Dar uneori, aveți nevoie exact de această funcționalitate (de exemplu, nu doriți să distribuiți o mulțime de fișiere sau nu doriți să îngreunați demontarea). Soluțiile comune pentru aceste probleme sunt să scrieți mai întâi DLL-ul într-un fișier temporar și să îl importați de acolo. Când programul se încheie, fișierul temporar este șters.

instagram viewer

Codul din articolul menționat este C ++, următorul pas a fost transformarea lui în Delphi. Din fericire, acest lucru a fost deja făcut de Martin Offenwanger (autorul DSPlayer).

Modul de memorie de Martin Offenwanger este o versiune extinsă a Delphi (și de asemenea Lazarus) compatibilă a C ++ a lui Joachim Bauch Modul de memorie 0.0.1. Pachetul zip include codul sursă complet Delphi al MemoyModule (BTMemoryModule.pas). În plus, există un Delphi și un eșantion inclus pentru a demonstra modul de utilizare.

Încărcarea DLL-urilor din resurse din memorie

Dacă o DLL demo este stocată ca o resursă folosind fișierul RC:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
începe
dacă 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) apoi
începe
rs: = TResourceStream. Creare (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Crea;
încerca
Domnișoară. LoadFromStream (rs);
Domnișoară. Poziție: = 0;
m_DllDataSize: = ms. Mărimea;
mp_DllData: = GetMemory (m_DllDataSize);
Domnișoară. Citiți (mp_DllData ^, m_DllDataSize);
in cele din urma
Domnișoară. Liber;
RS. Liber;
Sfârșit;
Sfârșit;
Sfârșit;
var
btMM: PBTMemoryModule;
începe
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
încerca
dacă btMM = zeroapoi Abandonați;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
dacă @m_TestCallstd = nil, atunci anulează;
m_TestCallstd ('Acesta este un apel Dll Memory!');
cu exceptia
Showmessage ('A apărut o eroare la încărcarea dll:' + BTMemoryGetLastError);
Sfârșit;
dacă Atribuit (btMM) apoi BTMemoryFreeLibrary (btMM);
Sfârșit;
  1. Aveți / creați un DLL
  2. Stocați DLL într-un fișier RES
  3. Avea Implementare BTMemoryModule.
  4. Prindeți DLL din resursă și încărcați-l direct în memorie.
  5. Utilizați metodele BTMemoryModule pentru a executa procedura din DLL în memorie.

BTMemoryLoadLibary in Delphi 2009, 2010,...

"BTMemoryModule.pas legat nu funcționează cu Delphi 2009 (și aș presupune și Delphi 2010).
Am găsit o versiune similară a fișierului BTMemoryModule.pas cu ceva timp în urmă și am făcut modificări, astfel încât să funcționeze cu (cel puțin) Delphi 2006, 2007 și 2009. Actualizările mele BTMemoryModule.pas actualizate și un proiect de exemplu sunt la BTMemoryLoadLibary pentru Delphi> = 2009"
instagram story viewer