Ilæg en DLL fra en ressource direkte fra hukommelse

click fraud protection

Artikelide af Mark E. Mos

Artiklen om, hvordan du gemmer en DLL i en Delphi-program exe-fil som en ressource, forklarer, hvordan du sender en DLL med din Delphi-applikations eksekverbare fil som en ressource.

Dynamiske linkbiblioteker indeholder koder eller ressourcer, der kan deles, giver de muligheden for flere applikationer at dele en enkelt kopi af en rutine (eller ressource), de har til fælles.

Ved brug af ressourcefiler (.RES), kan du integrere (og bruge) lydfiler, videoklip, animationer og mere generelt enhver form for binære filer i en Delphi-eksekverbar.

Indlæser DLL'er fra hukommelse

hvis en DLL gemt i en RES kan bruges uden først at gemme den på filsystemet (harddisk)

I henhold til artiklen Indlæser en DLL fra hukommelsen af Joachim Bauch, dette er muligt.

Sådan ser Joachim ud på problemet: Standard windows API-funktioner til at indlæse eksterne biblioteker i et program (LoadLibrary, LoadLibraryEx) fungerer kun med filer på filsystemet. Det er derfor umuligt at indlæse en DLL fra hukommelsen. Men nogle gange har du brug for nøjagtigt denne funktionalitet (f.eks. Ønsker du ikke at distribuere en masse filer eller vil gøre disassembling sværere). Almindelige løsninger på disse problemer er at skrive DLL'en i en midlertidig fil først og importere den derfra. Når programmet afsluttes, slettes den midlertidige fil.

instagram viewer

Koden i den nævnte artikel er C ++, det næste trin var at konvertere den til Delphi. Heldigvis er dette allerede gjort af Martin Offenwanger (forfatteren af DSPlayer).

Hukommelsesmodul af Martin Offenwanger er en udvidet Delphi (og også Lazarus) kompatibel version af Joachim Bauchs C ++ Hukommelsesmodul 0.0.1. ZIP-pakken inkluderer den komplette Delphi-kildekode til MemoyModule (BTMemoryModule.pas). Desuden er der en Delphi og prøve inkluderet for at demonstrere, hvordan man bruger den.

Indlæser DLL'er fra ressourcer fra hukommelse

Hvis en demo-DLL gemmes som en ressource ved hjælp af RC-filen:

DemoDLL RCDATA DemoDLL.dll
Var
ms: TMemoryStream;
rs: TResourceStream;
begynde
hvis 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) derefter
begynde
rs: = TResourceStream. Opret (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Skab;
prøve
Frk. LoadFromStream (rs);
Frk. Position: = 0;
m_DllDataSize: = ms. Størrelse;
mp_DllData: = GetMemory (m_DllDataSize);
Frk. Læs (mp_DllData ^, m_DllDataSize);
endelig
Frk. Gratis;
rs. Gratis;
ende;
ende;
ende;
Var
btMM: PBTMemoryModule;
begynde
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
prøve
hvis btMM = nulderefter Abort;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
hvis @m_TestCallstd = nul, afbryt;
m_TestCallstd ('Dette er et Dll-hukommelsesopkald!');
undtagen
Showmessage ('Der opstod en fejl under indlæsning af dll:' + BTMemoryGetLastError);
ende;
hvis Tildelt (btMM) derefter BTMemoryFreeLibrary (btMM);
ende;
  1. Har / Opret en DLL
  2. Opbevar DLL i en RES-fil
  3. Har BTMemoryModule-implementering.
  4. Grib DLL fra ressourcen, og indlæs den direkte i hukommelsen.
  5. Brug BTMemoryModule-metoder til at udføre procedure fra DLL i hukommelsen.

BTMemoryLoadLibary i Delphi 2009, 2010,...

"Den tilknyttede BTMemoryModule.pas fungerer ikke med Delphi 2009 (og jeg vil antage, at Delphi 2010 også).
Jeg fandt en lignende version af filen BTMemoryModule.pas for et stykke tid siden og lavede ændringer, så den fungerer med (mindst) Delphi 2006, 2007 og 2009. Min opdaterede BTMemoryModule.pas og et eksempelprojekt er på BTMemoryLoadLibary til Delphi> = 2009"
instagram story viewer