1. Mulai proyek DLL pertama Anda
1.file-> tutup semua-> file-> baru [dll >
Kode : |
// secara otomatis menghasilkan kode sebagai berikut Proyek Perpustakaan2; // Ini omong kosong. penggunaan Sysutils, Kelas; {$ R *.res} Mulai akhir. |
2. Tambahkan fungsi untuk masuk:
Kode : |
Proyek Perpustakaan2; penggunaan Sysutils, Kelas; Fungsi mymax (x, y: integer): integer; Mulai Jika x> y maka Hasil: = x kalau tidak Hasil: = y; akhir ; // Ingat: Nama perpustakaan tidak masalah, tetapi kasus Dll-Func terkait. // Menulis mymax dalam nama-func-name berbeda dari mymax. Jika ditulis salah, segera // Hasilnya adalah Anda meminta AP yang menggunakan DLL ini tidak dapat dibuka sama sekali. // Kasing parameter atas dan bawah tidak apa -apa. Bahkan tidak harus memiliki nama yang sama. Jika prototipe adalah (x, y: integer) // Tulislah sebagai (A, B: Integer) dalam waktu, tidak apa -apa. // Ingat: Tambahkan STDCall lain. Buku itu mengatakan bahwa jika Anda menulis DLL menggunakan Delphi, dan berharap tidak hanya untuk // Jika Delphi-AP juga berharap untuk menggunakan BCB/VC-AP, dll., Maka Anda sebaiknya menambahkan STDCall; // Pola Parameter: Delphi memiliki banyak pola variabel, yang tentu saja bukan seperti apa yang disukai DLL //, bahasa asli Windows/DLL harus C. Jadi jika kita ingin masuk dan keluar parameter DLL, kita // Gunakan sebanyak mungkin sesuai dengan aturan. Jika Anda menulis keduanya, yang terakhir akan menjadi banyak masalah. Jika Anda tidak terbiasa dengan C // Jika tidak apa -apa. Kami akan membicarakannya nanti. {$ R *.res} Mulai akhir. |
3. Kirimkan fungsi yang dapat dibagikan ini dari DLL dan biarkan dunia luar (ini delphi-ap Anda) Gunakan: Guangru
Karena itu, AP Anda tidak dapat menggunakan ini, Anda perlu menambahkan ekspor.
Kode : |
{$ R *.res} ekspor Mymax; Mulai akhir. |
4. Oke, Anda dapat menekan Ctrl-F9 untuk dikompilasi. Jangan tekan F9 saat ini. DLL bukan exe┌ yang tidak dapat dieksekusi secara terpisah. Jika DLL memiliki kesalahan saat ini, harap perbaiki. Tekan Ctrl-F9 lagi. Peringatan mungkin ada di sana saat ini, tidak masalah, pelajari saja dan lihatlah. Tekan Ctrl-F9 lagi, dan kemudian "selesai, disusun". Akan ada *.dll di direktori yang sama. Selamat, tugas selesai.
2. Lakukan tes: Buka aplikasi baru:
1. Tambahkan tbutton
Kode : |
Showmessage (inttoStr (mymax (30,50))); |
2. Katakan Exe untuk pergi ke sana untuk menangkap fungsi
Kode : |
// Tambahkan ke formulir, antarmuka, var Fungsi mymax (x, y: integer): integer; // mytestdll.dll menulis nama proyek DLL untuk Anda sebelumnya // Tidak masalah jika nama DLL atas dan lebih rendah. Tetapi ingat untuk menambahkan ekstensi .dll. Pada win95 atau nt, // Tidak perlu menambahkan ekstensi, tetapi kedua OSS ini mungkin kurang dan kurang. Anda perlu menambahkan ekstensi. |
Oke, ini sederhana.
Apakah contoh di atas sangat sederhana? Teman -teman yang terbiasa dengan Delphi dapat melihat bahwa kode di atas pada dasarnya sama dengan menulis program Delphi umum, kecuali bahwa ada parameter STDCall tambahan setelah fungsi testdll dan fungsi testdll dinyatakan menggunakan pernyataan Exports. Cukup kompilasi kode di atas dan Anda bisa mendapatkan pustaka tautan dinamis yang disebut delphi.dll. Sekarang, mari kita lihat apa yang perlu diperhatikan. 1. Semua fungsi atau prosedur yang ditulis dalam DLL harus ditambahkan dengan parameter panggilan STDCALL. Dalam lingkungan Delphi 1 atau Delphi 2, parameter panggilan jauh. Setelah Delphi 3, parameter ini diubah menjadi STDCall, dengan tujuan menggunakan teknologi transfer parameter Win32 standar alih -alih parameter register yang dioptimalkan. Lupa menggunakan parameter STDCALL adalah kesalahan umum. Alasannya adalah bahwa parameter register adalah parameter default Delphi.
2. Fungsi dan prosedur yang ditulis harus dinyatakan sebagai fungsi eksternal menggunakan pernyataan Ekspor.
Seperti yang Anda lihat, fungsi testdll dinyatakan sebagai fungsi eksternal. Ini memungkinkan fungsi untuk dilihat secara eksternal. (Jika tidak ada opsi tampilan cepat, Anda dapat menginstalnya dari CD Windows.) Fungsi testdll muncul di bilah tabel ekspor. Alasan lain yang bagus adalah bahwa jika kita tidak menyatakan seperti ini, fungsi yang kita tulis tidak akan dipanggil, yang merupakan sesuatu yang tidak ingin dilihat oleh siapa pun.
3. Ketika parameter dan variabel tipe string panjang digunakan, sharemem harus direferensikan.
Jenis string di Delphi sangat kuat. (Ya, Anda membacanya dengan benar, memang dua megabyte.) Pada saat ini, jika Anda bersikeras menggunakan parameter tipe string, variabel atau bahkan informasi perekaman, Anda harus merujuk ke unit sharemem, dan itu harus menjadi referensi pertama . Ini adalah unit yang direferensikan pertama setelah pernyataan penggunaan. Seperti yang ditunjukkan dalam contoh berikut:
penggunaan
Sharemem,
Sysutils,
Kelas;
Poin lain adalah bahwa hal yang sama harus dilakukan dalam file proyek Anda (*.dpr) alih -alih file unit (*.pas). Jika Anda tidak melakukan ini, Anda cenderung melakukan kecelakaan. Cara untuk menghindari menggunakan tipe string adalah dengan mendeklarasikan parameter, variabel, dll. Tipe string sebagai pchar atau shortstring (seperti: s: string [10]) tipe. Masalah yang sama terjadi ketika Anda menggunakan array dinamis, solusinya seperti yang dijelaskan di atas.
Bab 3: Panggilan Statis ke DLL Top di Delphi
Memanggil DLL lebih mudah daripada menulis DLL. Pertama, saya akan memperkenalkan metode panggilan statis kepada Anda. Demikian pula, mari pertama kali berikan contoh panggilan statis.
unit unit1;
antarmuka
penggunaan
Windows, pesan, sysutils, kelas, grafik,
Kontrol, formulir, dialog, stdctrls;
jenis
Tform1 = class (tform)
Edit1: tedit;
Button1: tbutton;
Prosedur Button1Click (pengirim: Tobject);
Pribadi
{Deklarasi Pribadi}
publik
{Deklarasi Publik}
akhir;
var
Form1: tform1;
Pelaksanaan
{$ R *.dfm}
// Kode berikut di baris ini adalah kode yang benar -benar kami tulis
function testdll (i: integer): integer; stdcall;
eksternal 'delphi.dll';
Prosedur TFORM1.BUTTON1CLICK (Pengirim: Tobject);
Mulai
Edit1.text: = inttoStr (testdll (1));
akhir;
akhir.
Dalam contoh di atas, kami menempatkan kotak edit (edit) dan tombol pada formulir, dan menulis sangat sedikit kode untuk menguji delphi.dll yang baru saja kami tulis. Anda dapat melihat bahwa satu -satunya pekerjaan yang kami lakukan adalah menempatkan bagian deskripsi dari fungsi testdll dalam implementasi dan menentukan lokasi delphi.dll dengan pernyataan eksternal. (Dalam contoh ini, program panggilan dan delphi.dll berada di direktori yang sama.) Sangat menarik bahwa fungsi testdll yang kami tulis sendiri dengan cepat dikenali oleh Delphi. Anda dapat melakukan percobaan seperti ini: masukkan "testdll (", dan segera Delphi akan menggunakan bilah fly-by prompt untuk meminta Anda parameter apa yang harus Anda masukkan, sesederhana menggunakan fungsi lain yang ditentukan dalam delphi. Catatan termasuk
Berikutnya:
1. Gunakan stdcall untuk memanggil parameter.
Seperti disebutkan di atas, ketika merujuk pada fungsi dan prosedur di DLL, Anda juga harus menggunakan parameter STDCall, untuk alasan yang sama seperti yang disebutkan di atas.
2. Gunakan pernyataan eksternal untuk menentukan jalur dan nama file DLL yang disebut.
Seperti yang Anda lihat, kami menentukan nama file DLL yang akan dipanggil dalam pernyataan eksternal. Tidak ada jalur tulis karena file DLL dan program utama yang menyebutnya di direktori yang sama. Jika file DLL ada di C:/, kita dapat menulis pernyataan referensi di atas sebagai eksternal 'c: /delphi.dll'. Perhatikan bahwa suffix.dll file harus ditulis.
3. Variabel global tidak dapat dipanggil dari DLL.
Jika kami mendeklarasikan beberapa jenis variabel global di DLL, seperti: var s: byte. Dengan cara ini, variabel global S dapat digunakan secara normal di DLL, tetapi S tidak dapat digunakan oleh program panggilan, dan S tidak dapat dilewati sebagai variabel global untuk program panggilan. Namun, variabel yang dinyatakan dalam program panggilan dapat dilewati sebagai parameter ke DLL.
4. DLL yang dipanggil harus ada.
Ini penting. Saat menggunakan metode panggilan statis, diperlukan file DLL yang dipanggil, fungsi atau prosedur yang akan dipanggil, dll. Harus ada. Jika jalur dan nama file yang ditentukan tidak ada atau jalur dan nama file yang ditentukan tidak benar, sistem akan meminta "kesalahan terjadi saat memulai program" atau "tidak ditemukan *.dll file" saat menjalankan program utama.
Bab 4 Memanggil DLL Top Dinamis di Delphi
DLL yang secara dinamis memanggil relatif rumit, tetapi sangat fleksibel. Untuk mengilustrasikan masalah secara menyeluruh, kali ini kami memberikan contoh memanggil DLL yang ditulis dalam C ++. Pertama, kompilasi program sumber DLL berikut di C ++.
#termasuk
Extern "C" _DECLSPEC (DLLEXPORT)
int winapi testc (int i)
{
Kembalikan i;
}
Setelah kompilasi, file DLL dihasilkan. Demi kenyamanan, kami masih merujuk pada program panggilan di atas, tetapi ganti pernyataan asli dalam proses Button1Click dengan kode berikut.
Prosedur TFORM1.BUTTON1CLICK (Pengirim: Tobject);
jenis
Tintfunc = function (i: integer): integer; stdcall;
var
TH: Thandle;
TF: Tintfunc;
TP: TFARPROC;
Mulai
Th: = loadLibrary ('cpp.dll');
Jika th> 0 lalu
mencoba
Tp: = getProcaddress (th, pchar ('testc'));
Jika TP <> nihil
Lalu mulai
Tf: = tintfunc (tp);
Edit1.text: = inttoStr (tf (1));
akhir
kalau tidak
Showmessage ('fungsi testc tidak ditemukan');
Akhirnya
Freelibrary (th); {rilis dll}
akhir
kalau tidak
Showmessage ('cpp.dll tidak ditemukan');
akhir;
Seperti yang telah Anda lihat, teknik panggilan dinamis ini sangat rumit, tetapi selama Anda memodifikasi parameter, seperti memodifikasi nama DLL di loadlibrary ('cpp.dll') menjadi 'delphi.dll', Anda dapat mengubah secara dinamis disebut dll.
1. Tentukan jenis fungsi atau prosedur yang akan dipanggil.
Dalam kode di atas kami mendefinisikan tipe Tintfunc, yang sesuai dengan fungsi testc yang akan kami hubungi. Pekerjaan definisi yang sama harus dilakukan dalam panggilan lain. Dan juga menambahkan parameter panggilan stdcall.
2. Lepaskan DLL yang dipanggil.
Kami memanggil DLL secara dinamis dengan LoadLibrary, tetapi ingat bahwa Anda harus secara manual melepaskan DLL dengan freelibrary setelah digunakan, jika tidak, DLL akan memori sampai Anda keluar dari jendela atau mati.
Sekarang mari kita evaluasi kelebihan dan kekurangan dari dua metode memanggil DLL. Metode statis mudah diimplementasikan, mudah dikuasai, dan umumnya sedikit lebih cepat, dan lebih aman dan lebih dapat diandalkan; Untuk berjalan sampai DLL dirilis hanya di akhir program, dan hanya sistem berbasis kompiler seperti Delphi yang dapat menggunakan metode ini. Metode dinamis menyelesaikan kekurangan dalam metode statis, dan dapat dengan mudah mengakses fungsi dan prosedur dalam DLL, dan bahkan fungsi atau prosedur yang baru ditambahkan dalam beberapa versi lama DLL; Fungsi atau prosedur perlu mendefinisikan banyak jenis dan metode panggilan yang kompleks. Untuk pemula, penulis merekomendasikan agar Anda menggunakan metode statis dan kemudian menggunakan metode panggilan dinamis setelah Anda mahir.
Bab 5 Tip Praktis untuk Menggunakan DLL Top
1. Keterampilan Menulis.
1. Untuk memastikan kebenaran DLL, Anda dapat menulisnya terlebih dahulu sebagai bagian dari aplikasi biasa, men -debug dengan benar, dan kemudian memisahkannya dari program utama dan mengkompilasinya menjadi DLL.
2. Untuk memastikan universalitas DLL, Anda harus mencegah nama kontrol visual dari tampil di DLL yang Anda tulis sendiri, seperti: edit1 nama di edit1.text; beberapa catatan.
3. Untuk memfasilitasi debugging, setiap fungsi dan proses harus sesingkat dan ringkas mungkin, dan harus disertai dengan anotasi spesifik dan terperinci.
4. Cobalah akhirnya harus digunakan untuk menangani kemungkinan kesalahan dan pengecualian.
5. Referensi sesedikit mungkin untuk mengurangi ukuran DLL, terutama tidak merujuk ke unit visual, seperti unit dialog. Misalnya, secara umum, kami tidak dapat merujuk unit kelas, yang dapat mengurangi DLL yang dikompilasi sekitar 16kb.
2. Keterampilan memanggil.
1. Saat menggunakan metode statis, Anda dapat mengganti nama fungsi atau prosedur yang dipanggil. Dalam contoh DLL yang ditulis dalam C ++ yang disebutkan di atas, jika pernyataan "C" eksternal dihapus, C ++ akan menyusun beberapa nama fungsi yang aneh, dan fungsi testc asli akan dinamai @testc $ S dan nama aneh konyol lainnya. Ini karena C ++ Menggunakan C ++ Name Mangling Technology. Nama fungsi ini ilegal di Delphi, kita dapat menyelesaikan masalah ini seperti ini:
Tulis ulang fungsi referensi sebagai
fungsi testc (i: integer): integer; stdcall;
eksternal 'cpp.dll'; name '@testc $ s';
Fungsi nama adalah untuk mengganti nama.
2. Anda dapat meletakkan DLL yang kami tulis di direktori Windows atau direktori Windows/System. Melakukannya hanya dapat menulis nama DLL tanpa menulis jalur dalam pernyataan eksternal atau dalam pernyataan LoadLibrary. Tetapi agak tidak pantas untuk melakukan ini. Letakkan DLL yang Anda tulis di dalamnya ada di direktori sistem!
3. Keterampilan debugging.
1. Kita tahu bahwa DLL tidak dapat dijalankan dan men -debug langkah demi langkah saat menulis. Ada cara untuk melakukan ini, yaitu, mengatur program host di menu Run | Parameters. Tambahkan nama program host ke bilah aplikasi host halaman lokal untuk melakukan debugging langkah demi langkah, pengamatan breakpoint dan berjalan.
2. Tambahkan informasi versi DLL. Pernyataan pembukaan menyebutkan bahwa informasi versi sangat penting untuk DLL. Layak menambahkan ruang kecil seperti itu. Sayangnya, tidak mungkin menggunakan opsi versi di menu Project | Options secara langsung. Seperti yang ditunjukkan dalam contoh berikut:
Perpustakaan Delphi;
penggunaan
Sysutils,
Kelas;
{$ R *.res}
// Perhatikan bahwa baris kode di atas harus ditambahkan dalam posisi ini
function testdll (i: integer): integer; stdcall;
Mulai
Hasil: = i;
akhir;
ekspor
Testdll;
Mulai
akhir.
3. Untuk menghindari duplikasi nama -nama dengan DLL lain, yang terbaik adalah menggunakan campuran karakter, angka, dan garis bawah saat menyebut DLL yang Anda tulis. Misalnya: jl_try16.dll.
4. Jika Anda telah menyusun beberapa DLL di Delphi 1 atau Delphi 2, DLL yang Anda kumpulkan adalah 16-bit. Cukup kompilasi ulang kode sumber di lingkungan Delphi 3 atau Delphi 4 yang baru dan Anda bisa mendapatkan DLL 32-bit.
[Setelah catatan]: Selain metode yang paling umum digunakan untuk menggunakan DLL yang diperkenalkan di atas, DLL juga dapat digunakan sebagai pembawa sumber daya. Misalnya, mengubah ikon di Windows adalah sumber daya dalam DLL yang digunakan. Selain itu, memiliki teknologi desain DLL yang dikuasai memiliki banyak manfaat untuk menggunakan pemrograman OLE, COM dan ActiveX yang lebih canggih.