Încărcați un DLL dintr-o resursă direct din memorie în aplicațiile Delphi

Ideea articolului de Mark E. Moss

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

Bibliotecile de legături dinamice conțin cod sau resurse care pot fi folosite, acestea oferă posibilitatea ca mai multe aplicații să partajeze o singură copie a unei rutine (sau resurse) pe care le au în comun.

Folosind fișiere de resurse (.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 Delphi executabil..

Î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 Încărcarea unui DLL din memorie de către 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.

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).

Memory Module de Martin Offenwanger este o versiune extinsă (compatibilă Delphi (și de asemenea Lazarus)) a modulului de memorie C ++ Joachim Bauch 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 cum să îl utilizați.

Î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.Create (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream.Create;
încerca
ms.LoadFromStream (rs);
ms.Pozitie: = 0;
m_DllDataSize: = ms.Size;
mp_DllData: = GetMemory (m_DllDataSize);
ms.Read (mp_DllData ^, m_DllDataSize);
in cele din urma
ms.Free;
rs.Free;
Sfârșit;
Sfârșit;
Sfârșit;
var
btMM: PBTMemoryModule;
începe
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
încerca
dacă btMM = zero apoi Abandonați;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
dacă @m_TestCallstd = nil, atunci anulați;
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. Puneți în aplicare 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 în 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, precum și un proiect de exemplu, sunt la BTMemoryLoadLibary pentru Delphi> = 2009 "