Produksi Dll umumnya dibagi menjadi beberapa langkah berikut:
1 Tulis prosedur atau fungsi dalam proyek DLL
2 Tulis kata kunci Ekspor dan tulis nama prosedur di bawahnya. Tidak perlu menulis parameter dan memanggil sufiks.
Dua parameter lolos
1 Tipe parameter harus konsisten dengan tipe parameter jendela C++. Jangan gunakan tipe data DELPHI.
2 Yang terbaik adalah memiliki nilai kembalian [meskipun itu adalah prosedur] untuk melaporkan keberhasilan atau kegagalan panggilan, atau statusnya. Nilai kembalian keberhasilan atau kegagalan sebaiknya 1 [sukses] atau 0 [gagal]. Singkatnya, ini kompatibel dengan Windows C++.
3 Deklarasikan sufiks dengan stdcall.
4 Sebaiknya peka huruf besar-kecil.
5 Tidak perlu menggunakan akhiran panggilan jauh, ini hanya untuk kompatibilitas dengan program Windows 16-bit.
Inisialisasi dan pembersihan keluar dari tiga DLL [jika inisialisasi dan pembersihan keluar diperlukan]
1 DLLPROc [sebuah Pointer dari unit SysUtils] adalah pintu masuk ke DLL. Di sini Anda dapat mengganti entri dengan fungsi Anda. Namun fungsi Anda harus memenuhi persyaratan berikut [sebenarnya fungsi panggilan balik]. sebagai berikut:
prosedur DllEnterPoint(dwReason: DWord);far;stdcall;
Ada empat jenis parameter dwReason:
DLL_PROCESS_ATTACH : Saat proses masuk
DLL_PROCESS_DETACH saat proses keluar
DLL_THREAD_ATTACH saat thread masuk
DLL_THREAD_DETACH saat thread keluar
Di bagian inisialisasi tulis:
DLLProc := @DLLEnterPoint;
DllEnterPoint(DLL_PROCESS_ATTACH);
2 Jika ada komponen TdcomConnection pada Formulir, gunakan Uses Activex dan tulis CoInitialize (nil) selama inisialisasi;
3 Pastikan DcomConnection.Connected := False saat keluar, dan kumpulan data telah ditutup. Jika tidak, alamat yang dilaporkan salah.
Penggunaan empat variabel global
Pada program Widnows 32-bit, ruang alamat kedua aplikasi tidak berhubungan satu sama lain. Meskipun DLL adalah salinan di memori, variabelnya berada di ruang alamat setiap proses, jadi Anda tidak dapat menggunakan variabel global dll untuk mentransfer data antara dua aplikasi kecuali Anda menggunakan file gambar memori.
5. Panggil pemuatan statis
1 Deklarasi fungsi klien:
1) Peka huruf besar-kecil.
2) Sama seperti deklarasi di DLL.
Seperti: showform(form:Tform);Far;external'yproject_dll.dll';
3) Tipe parameter yang diteruskan saat pemanggilan harus sama dengan Windows C++.
4) Saat memanggil, DLL harus berada di jalur pencarian windows. Urutannya adalah: jalur direktori saat ini;
Enam panggilan untuk pemuatan dinamis
1 Buat tipe prosedur [Jika Anda memahami dengan jelas sifat variabel tipe prosedur hanya sebagai penunjuk, Anda akan tahu apa yang sedang terjadi]. menyukai:
jenis
mypointer=procedure(form:Tform);Jauh;eksternal;
var
Petunjuk: Pegangan;
bentuk pertunjukan: penunjuk saya;
mulai
Petunjuk:=loadlibrary('yproject_dll');//Muat Dll dan temukan berdasarkan nama file.
showform:=getprocaddress(Hinst,'showform');//Temukan berdasarkan nama fungsi, peka huruf besar-kecil. Hal ini jelas jika Anda mengetahui sifat objek otomasi.
showform(application.mainform);//Dipanggil ketika menemukan penunjuk entri fungsi.
Perpustakaan Gratis(Petunjuk);
akhir;
7. Buat TForM di DLL
1 Menggunakan Formulir Anda ke Dll, dan unit terkait yang digunakan oleh Formulir Anda juga harus Digunakan di [Ini adalah poin yang paling merepotkan, karena Formulir Anda mungkin Menggunakan banyak unit atau fungsi khusus]
2 Lewatkan parameter Aplikasi dan gunakan untuk membuat Formulir.
8. Buat TMDIChildForM di DLL
1 MDIForm.FormStyle di Dll tidak harus fmMDICild.
2 Tulislah dua kalimat berikut setelah CreateForm:
fungsi ShowForm(mainForm:TForm):integer;stdcall
var
Formulir1: TForm1;
ptr:PLongInt;
mulai
ptr:=@(Application.MainForm);//Simpan dulu handle MainForm dll, tidak perlu dilepas, cukup ganti saja
ptr^:=LongInt(mainForm);//Ganti MainForm dari DLL dengan mainForm dari program pemanggil. MainForm adalah WINDOW khusus yang secara khusus mengelola sumber daya Formulir di Aplikasi.
//Mengapa tidak langsung Application.MainForm := mainForm, karena Application.MainForm adalah properti read-only
Form1:=TForm1.Create(mainForm);//Buat dengan parameter
akhir;
Catatan: Parameternya adalah Application.MainForm dari program pemanggil
Sembilan contoh:
Kode sumber DLL:
proyek perpustakaan2;
kegunaan
sistemUtils,
Kelas,
Dialog,
Formulir,
Unit2 di 'Unit2.pas' {Form2};
{$R *.RES}
var
ccc:Pchar;
prosedur OpenForm(mainForm:TForm);stdcall;
var
Formulir1: TForm1;
ptr:PLongInt;
mulai
ptr:=@(Aplikasi.Formulir Utama);
ptr^:=LongInt(bentuk utama);
Formulir1:=TForm1.Buat(Form utama);
akhir;
prosedur InputCCC(Teks: Pchar);stdcall;
mulai
ccc := Teks;
akhir;
prosedur TampilkanCCC;stdcall;
mulai
ShowMessage(String(ccc));
akhir;
ekspor
Formulir Terbuka;
masukanCCC,
TampilkanCCC;
mulai
akhir.
Kode sumber pemanggil:
satuan Unit1;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Kelas, Grafik, Kontrol, Formulir, Dialog,
StdCtrls;
jenis
TForm1 = kelas(TForm)
Tombol1: Tombol T;
Tombol2: Tombol T;
Sunting1: TEdit;
prosedur Button1Click(Pengirim: TObject);
prosedur Button2Click(Pengirim: TObject);
pribadi
{Deklarasi pribadi}
publik
{Pernyataan publik}
akhir;
var
Formulir1: TForm1;
pelaksanaan
{$R *.DFM}
procedure OpenForm(mainForm:TForm);stdcall;External'project2.dll';
prosedur ShowCCC;stdcall;External'project2.dll';
procedure InputCCC(Teks: Pchar);stdcall;External'project2.dll';
prosedur TForm1.Button1Click(Pengirim: TObject);
var
Teks: Pchar;
mulai
Teks := Pchar(Edit1.Teks);
// OpenForm(Application.MainForm);//Untuk menyesuaikan MDICHILD
InputCCC(Teks);//Untuk bereksperimen apakah variabel global dalam DLL dibagi antara berbagai aplikasi
akhir;
prosedur TForm1.Button2Click(Pengirim: TObject);
mulai
ShowCCC;//Ini menunjukkan bahwa variabel global dalam DLL aplikasi WINDOWS 32-bit juga berada dalam ruang alamat aplikasi. Aplikasi 16-bit mungkin berbeda, dan tidak ada percobaan yang dilakukan.
akhir;