Doğrudan Bellekten Kaynaktan DLL Yükleme

Makale fikri Mark E. yosun

Bir DLL dosyasını bir Delphi programı exe dosyası içinde bir kaynak olarak nasıl depolayacağımız makalesinde, bir DLL'nin Delphi uygulaması yürütülebilir dosyasıyla kaynak olarak nasıl gönderileceği açıklanmaktadır.

Dinamik bağlantı kitaplıkları paylaşılabilir kod veya kaynaklar içeriyorsa, birden fazla uygulamanın ortak bir rutinin (veya kaynağın) tek bir kopyasını paylaşma olanağı sağlar.

kullanma kaynak (.RES) dosyaları, ses dosyalarını, video klipleri, animasyonları ve daha genel olarak her türlü ikili dosyayı bir Delphi yürütülebilir dosyasına gömebilir (ve kullanabilirsiniz).

DLL'leri Bellekten Yükleme

RES'de saklanan bir DLL dosyası önce dosya sistemine (sabit disk) kaydedilmeden kullanılabilirse

Makaleye göre Bellekten DLL yükleme Joachim Bauch ile bu mümkün.

Joachim'in soruna nasıl baktığı: Bir programa harici kütüphaneler (LoadLibrary, LoadLibraryEx) yüklemek için varsayılan windows API işlevleri yalnızca dosya sistemindeki dosyalarla çalışır. Bu nedenle bellekten bir DLL yüklemek imkansızdır. Ancak bazen, tam olarak bu işlevselliğe ihtiyacınız vardır (örn. Çok fazla dosya dağıtmak veya sökülmeyi zorlaştırmak istemezsiniz). Bu sorunlara ilişkin genel çözümler, önce DLL dosyasını geçici bir dosyaya yazmak ve oradan almaktır. Program sona erdiğinde geçici dosya silinir.

instagram viewer

Bahsedilen makaledeki kod C ++, sonraki adım Delphi dönüştürmek oldu. Neyse ki, bu zaten Martin Offenwanger tarafından yapılmıştır ( DSPlayer).

Bellek modülü Martin Offenwanger, Joachim Bauch C ++ 'ın genişletilmiş Delphi (ve ayrıca Lazarus) uyumlu bir sürümüdür Bellek Modülü 0.0.1. Zip paketi MemoyModule'un eksiksiz Delphi kaynak kodunu içerir (BTMemoryModule.pas). Ayrıca nasıl kullanılacağını göstermek için bir Delphi ve örnek vardır.

DLL'leri Kaynaklardan Bellekten Yükleme

Bir demo DLL dosyası RC dosyası kullanılarak kaynak olarak depolanıyorsa:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
başla
Eğer 0 <> Kaynak Bul (hInstance, 'DemoDLL', RT_RCDATA) sonra
başla
rs: = TResourceStream. Oluştur (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Oluşturmak;
Deneyin
Hanım. LoadFromStream (rs);
Hanım. Konum: = 0;
m_DllDataSize: = ms. Boyut;
mp_DllData: = GetMemory (m_DllDataSize);
Hanım. Oku (mp_DllData ^, m_DllDataSize);
en sonunda
Hanım. Bedava;
rs. Bedava;
son;
son;
son;
var
btMM: PBTMemoryModule;
başla
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
Deneyin
btMM = ise sıfırsonra İptal;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
@m_TestCallstd = nil ise İptal Et;
m_TestCallstd ('Bu bir Dll Bellek çağrısıdır!');
dışında
Showmessage ('dll yüklenirken bir hata oluştu:' + BTMemoryGetLastError);
son;
Eğer Atandı (btMM) sonra BTMemoryFreeLibrary (btMM);
son;
  1. DLL Oluştur / Oluştur
  2. DLL dosyasını bir RES dosyasında depolama
  3. Sahip olmak BTMemoryModule uygulaması.
  4. DLL kaynaktan alın ve doğrudan belleğe yükleyin.
  5. Bellekteki DLL'den yordamı yürütmek için BTMemoryModule yöntemlerini kullanın.

Delphi 2009, 2010'da BTMemoryLoadLibary,...

"Bağlantılı BTMemoryModule.pas, Delphi 2009 ile çalışmıyor (ve Delphi 2010'u da varsayalım).
BTMemoryModule.pas dosyasının benzer bir sürümünü bir süre önce buldum ve değişiklikler yaptım (en azından) Delphi 2006, 2007 ve 2009 ile çalışacak. Güncellenmiş BTMemoryModule.pas ve örnek bir projem Delphi için BTMemoryLoadLibary> = 2009"