Lataa DLL resurssista suoraan muistista

click fraud protection

Artikkeliidea kirjoittanut Mark E. sammal

Artikkelissa, jolla DLL-tiedosto tallennetaan Delphi-ohjelman exe-tiedostoon resurssina, selitetään, kuinka DLL voidaan lähettää Delphi-sovelluksen suoritettavan tiedoston kanssa resurssina.

Dynaamiset linkkikirjastot sisältävät jaettavan koodin tai resurssit, ne tarjoavat useille sovelluksille mahdollisuuden jakaa yksi kopio rutiinista (tai resurssista), joka heillä on yhteinen.

käyttämällä resurssitiedostot (.RES), voit upottaa (ja käyttää) äänitiedostoja, videoleikkeitä, animaatioita ja yleisemmin kaikenlaisia ​​binaaritiedostoja Delphi-suoritettavaan tiedostoon.

DLL-tiedostojen lataaminen muistista

jos RES-tiedostoon tallennettua DLL: ää voidaan käyttää tallentamatta sitä ensin tiedostojärjestelmään (kiintolevy)

Artikkelin mukaan Ladataan DLL muistista kirjoittanut Joachim Bauch, tämä on mahdollista.

Joachim suhtautuu asiaan seuraavasti: Windowsin oletussovellusliittymätoiminnot lataavat ulkoiset kirjastot ohjelmaan (LoadLibrary, LoadLibraryEx) toimivat vain tiedostojärjestelmän tiedostojen kanssa. Siksi on mahdotonta ladata DLL-muistia. Mutta joskus tarvitset juuri tätä toimintoa (esim. Et halua jakaa paljon tiedostoja tai haluat tehdä purkamisen vaikeammaksi). Tämän ongelman yleisiä kiertotapoja ovat DLL-tiedoston kirjoittaminen ensin väliaikaiseen tiedostoon ja tuonti sieltä. Kun ohjelma päättyy, väliaikainen tiedosto poistetaan.

instagram viewer

Mainitussa artikkelissa oleva koodi on C ++, seuraava askel oli muuntaa se Delphiksi. Onneksi tämän on jo tehnyt Martin Offenwanger (tekstin kirjoittaja) DSPlayer).

Muistimoduuli kirjoittanut Martin Offenwanger on laajennettu Delphi (ja myös Lazarus) -yhteensopiva versio Joachim Bauchin C ++: sta Muistimoduuli 0.0.1. Zip-paketti sisältää MemoyModule-moduulin täydellisen Delphi-lähdekoodin (BTMemoryModule.pas). Lisäksi mukana on Delphi ja näyte, jotka osoittavat sen käytön.

DLL-tiedostojen lataaminen muistista tulevista resursseista

Jos esittely DLL tallennetaan resurssina RC-tiedoston avulla:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
alkaa
jos 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) sitten
alkaa
rs: = TResourceStream. Luo (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Luoda;
yrittää
neiti. LoadFromStream (rs);
neiti. Asema: = 0;
m_DllDataSize: = ms. Koko;
mp_DllData: = GetMemory (m_DllDataSize);
neiti. Lue (mp_DllData ^, m_DllDataSize);
vihdoin
neiti. Vapaa;
rs. Vapaa;
pää;
pää;
pää;
var
btMM: PBTMemoryModule;
alkaa
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
yrittää
jos btMM = nollasitten Keskeyttää;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
jos @m_TestCallstd = nolla, keskeytä;
m_TestCallstd ('Tämä on dll-muistikutsut!');
paitsi
Showmessage ('Virhe, joka havaittiin dll: n lataamisessa:' + BTMemoryGetLastError);
pää;
jos Määritetty (btMM) sitten BTMemoryFreeLibrary (btMM);
end;
  1. Onko / luo DLL
  2. Tallenna DLL RES-tiedostoon
  3. Omistaa BTMemoryModule-toteutus.
  4. Tartu DLL: stä resurssista ja lataa se suoraan muistiin.
  5. Käytä BTMemoryModule-menetelmiä suorittaaksesi toimenpide muistissa olevasta DLL: stä.

BTMemoryLoadLibary Delphissä 2009, 2010,...

"Linkitetty BTMemoryModule.pas ei toimi Delphi 2009: n kanssa (ja oletan myös, että Delphi 2010).
Löysin samanlaisen version BTMemoryModule.pas-tiedostosta jonkin aikaa sitten, ja tein muutoksia, jotta se toimii (ainakin) Delphi 2006, 2007 ja 2009 -versioiden kanssa. Päivitetty BTMemoryModule.pas ja näyteprojekti ovat osoitteessa BTMemoryLoadLibary Delphille> = 2009"
instagram story viewer