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