I artikeln hur du lagrar en DLL i en exe-fil från Delphi-programmet som en resurs förklaras hur du skickar en DLL med din körbara fil från Delphi-applikationen som en resurs..
Dynamiska länkbibliotek innehåller delbar kod eller resurser, de ger möjlighet för flera applikationer att dela en enda kopia av en rutin (eller resurs) de har gemensamt.
Med hjälp av resursfiler (.RES) kan du bädda in (och använda) ljudfiler, videoklipp, animationer och mer allmänt alla typer av binära filer i en Delphi-körbar.
Enligt artikeln Laddar en DLL från minne av Joachim Bauch är detta möjligt.
Så här ser Joachim på frågan: Standardfönster API-funktioner för att ladda externa bibliotek i ett program (LoadLibrary, LoadLibraryEx) fungerar bara med filer i filsystemet. Det är därför omöjligt att ladda en DLL från minnet. Men ibland behöver du exakt den här funktionen (t.ex. vill du inte distribuera många filer eller vill göra isärtagning svårare). Vanliga lösningar för dessa problem är att skriva DLL-filen till en tillfällig fil först och importera den därifrån. När programmet avslutas raderas den tillfälliga filen.
Koden i den nämnda artikeln är C ++, nästa steg var att konvertera den till Delphi. Lyckligtvis har detta redan gjorts av Martin Offenwanger (författaren till DSPlayer).
Memory Module av Martin Offenwanger är en utökad Delphi (och även Lazarus) kompatibel version av Joachim Bauchs C ++ Memory Module 0.0.1. Zip-paketet innehåller den kompletta Delphi-källkoden för MemoyModule (BTMemoryModule.pas). Dessutom finns en Delphi och ett prov inkluderat för att demonstrera hur man använder det.
Om en demo-DLL lagras som en resurs med RC-filen:
DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
Börja
om 0 FindResource (hInstance, 'DemoDLL', RT_RCDATA) sedan
Börja
rs: = TResourceStream.Create (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream.Create;
Prova
ms.LoadFromStream (rs);
ms.Position: = 0;
m_DllDataSize: = ms.Size;
mp_DllData: = GetMemory (m_DllDataSize);
ms.Read (mp_DllData ^, m_DllDataSize);
till sist
ms.Free;
rs.Free;
slutet;
slutet;
slutet;
var
btMM: PBTMemoryModule;
Börja
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
Prova
om btMM = noll sedan Avbryta;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
om @m_TestCallstd = noll, avbryt;
m_TestCallstd ('Detta är ett Dll-minne-samtal!');
bortsett från
Showmessage ('Ett fel uppstod vid laddning av dll:' + BTMemoryGetLastError);
slutet;
om Delad (btMM) sedan BTMemoryFreeLibrary (btMM);
slutet;