Ide artikel oleh Mark E. Lumut
Artikel cara menyimpan DLL di dalam file exe program Delphi sebagai sumber daya menjelaskan cara mengirim DLL dengan file yang dapat dieksekusi aplikasi Delphi sebagai sumber daya.
Pustaka tautan dinamis berisi kode atau sumber daya yang dapat dibagi, mereka menyediakan kemampuan untuk beberapa aplikasi untuk berbagi satu salinan rutin (atau sumber daya) yang mereka miliki bersama.
Menggunakan file sumber daya (.RES), Anda dapat menyematkan (dan menggunakan) file suara, klip video, animasi dan lebih umum semua jenis file biner dalam sebuah Delphi yang dapat dieksekusi.
Memuat DLL Dari Memori
jika DLL yang disimpan dalam RES dapat digunakan tanpa terlebih dahulu menyimpannya di sistem file (hard disk)
Menurut artikel itu Memuat DLL dari memori oleh Joachim Bauch, ini mungkin.
Begini cara Joachim melihat masalah: API windows default berfungsi untuk memuat pustaka eksternal ke dalam suatu program yang hanya berfungsi dengan file pada sistem file. Karena itu mustahil untuk memuat DLL dari memori. Namun terkadang, Anda membutuhkan fungsi ini secara tepat (mis. Anda tidak ingin mendistribusikan banyak file atau ingin membuat pembongkaran lebih sulit). Solusi umum untuk masalah ini adalah menulis DLL ke file sementara terlebih dahulu dan mengimpornya dari sana. Ketika program berakhir, file sementara akan dihapus.
Kode dalam artikel yang disebutkan adalah C ++, langkah selanjutnya adalah mengubahnya menjadi Delphi. Untungnya, ini sudah dilakukan oleh Martin Offenwanger (penulis buku DSPlayer).
Modul Memori oleh Martin Offenwanger adalah versi yang kompatibel dengan Delphi (dan juga Lazarus) dari Joachim Bauch's C ++ Modul Memori 0.0.1. Paket zip termasuk kode sumber Delphi lengkap dari MemoyModule (BTMemoryModule.pas). Selain itu ada Delphi dan sampel disertakan untuk menunjukkan cara menggunakannya.
Memuat DLL Dari Sumber Daya Dari Memori
Jika demo DLL disimpan sebagai sumber daya menggunakan file RC:
DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
mulai
jika 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) kemudian
mulai
rs: = TResourceStream. Buat (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Membuat;
mencoba
Nona. LoadFromStream (rs);
Nona. Posisi: = 0;
m_DllDataSize: = ms. Ukuran;
mp_DllData: = GetMemory (m_DllDataSize);
Nona. Baca (mp_DllData ^, m_DllDataSize);
akhirnya
Nona. Gratis;
rs. Gratis;
akhir;
akhir;
akhir;
var
btMM: PBTMemoryModule;
mulai
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
mencoba
jika btMM = nolkemudian Menggugurkan;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
jika @m_TestCallstd = nil maka Batalkan;
m_TestCallstd ('Ini panggilan Memori Dll!');
kecuali
Showmessage ('Terjadi kesalahan saat memuat dll:' + BTMemoryGetLastError);
akhir;
jika Ditugaskan (btMM) kemudian BTMemoryFreeLibrary (btMM);
akhir;
- Memiliki / Membuat DLL
- Simpan DLL dalam file RES
- Memiliki Implementasi BTMemoryModule.
- Ambil DLL dari sumber daya dan muat langsung ke memori.
- Gunakan metode BTMemoryModule untuk menjalankan prosedur dari DLL dalam memori.
BTMemoryLoadLibary dalam Delphi 2009, 2010,...
Saya menemukan versi yang serupa dari file BTMemoryModule.pas beberapa waktu yang lalu, dan membuat perubahan sehingga berfungsi dengan (setidaknya) Delphi 2006, 2007 dan 2009. BTMemoryModule.pas saya yang diperbarui, dan proyek sampel, ada di BTMemoryLoadLibary untuk Delphi> = 2009"