Artikelidé av Mark E. Mossa
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.
Använder sig av resursfiler (.RES), kan du bädda in (och använda) ljudfiler, videoklipp, animationer och mer generellt alla typer av binära filer i en Delphi-körbar.
Laddar DLL från minnet
om en DLL lagrad i en RES kan användas utan att först spara den på filsystemet (hårddisk)
Enligt artikeln Laddar en DLL från minnet av Joachim Bauch, detta är möjligt.
Så här ser Joachim på frågan: Standardfönster-API-funktionerna 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 detta 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).
Minnesmodul av Martin Offenwanger är en utökad Delphi (och även Lazarus) kompatibel version av Joachim Bauchs C ++ Minnesmodul 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.
Laddar DLL från resurser från minne
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. Skapa (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Skapa;
Prova
Fröken. LoadFromStream (rs);
Fröken. Position: = 0;
m_DllDataSize: = ms. Storlek;
mp_DllData: = GetMemory (m_DllDataSize);
Fröken. Läs (mp_DllData ^, m_DllDataSize);
till sist
Fröken. Fri;
rs. Fri;
slutet;
slutet;
slutet;
var
btMM: PBTMemoryModule;
Börja
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
Prova
om btMM = nollsedan 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 inträffade vid laddning av dll:' + BTMemoryGetLastError);
slutet;
om Tilldelad (btMM) sedan BTMemoryFreeLibrary (btMM);
slutet;
- Har / Skapa en DLL
- Lagra DLL i en RES-fil
- Ha BTMemoryModule-implementering.
- Ta tag i DLL från resursen och ladda den direkt i minnet.
- Använd BTMemoryModule-metoder för att köra proceduren från DLL i minnet.
BTMemoryLoadLibary i Delphi 2009, 2010,...
Jag hittade en liknande version av filen BTMemoryModule.pas för ett tag sedan och gjorde ändringar så att den fungerar med (åtminstone) Delphi 2006, 2007 och 2009. Min uppdaterade BTMemoryModule.pas och ett exempelprojekt är på BTMemoryLoadLibary för Delphi> = 2009"