Pustaka tautan dinamis adalah kumpulan prosedur dan fungsi yang dapat dipanggil oleh aplikasi dan DLL lainnya. Pustaka ini berisi kode atau sumber daya publik. Karena kode DLL menggunakan teknologi berbagi memori, Windows juga memberikan DLL izin yang lebih tinggi di beberapa tempat, sehingga DLL dapat mengimplementasikan beberapa fungsi yang tidak dapat dicapai oleh program biasa, seperti mengimplementasikan Windows HOOK, ISAPI, dll. Pada saat yang sama, DLL juga menyediakan cara mudah untuk berbagi kode antar bahasa yang berbeda. Oleh karena itu, DLL banyak digunakan dalam pemrograman. Artikel ini akan memperkenalkan cara membuat dan menggunakan DLL di Delphi.
satu. Mekanisme berbagi memori perpustakaan DLL
Dari segi penggunaan, DLL dan unit sangat mirip. Keduanya dapat dipanggil oleh modul proyek lain, namun terdapat perbedaan dalam mekanisme implementasi internalnya. Jika modul program menggunakan pernyataan penggunaan untuk mereferensikan suatu unit, ketika kompiler mengkompilasi modul tersebut, ia akan mengkompilasinya bersama dengan unit tersebut dan menghubungkan kode eksekusi yang telah dikompilasi ke modul program. Ini adalah bagaimana modul program dapat Alasan pemanggilan prosedur dan fungsi pada unit yang diacu. Ketika unit yang sama direferensikan oleh beberapa proyek, setiap proyek berisi kode yang dapat dieksekusi dari unit tersebut. Ketika beberapa proyek yang berisi unit tersebut dijalankan pada saat yang sama, kode yang dapat dieksekusi dari unit tersebut akan diperbarui beberapa kali dengan proyek yang berbeda ke dalam memori, menyebabkan pemborosan sumber daya memori. DLL berbeda. Sekalipun dipanggil oleh proyek tertentu, ia tetap independen setelah kompilasi. Artinya, setelah kompilasi, pustaka DLL membentuk file executable terpisah dan tidak terhubung dengan file executable lainnya Pustaka DLL tidak tunduk pada proyek tertentu. Ketika beberapa proyek memanggil pustaka DLL yang sama, hanya proyek pertama yang mentransfer pustaka DLL ke dalam memori area memori bersama yang sama. Selain itu, kode eksekusi DLL ditransfer secara dinamis selama menjalankan program, bukan ditransfer ke memori bersama dengan keseluruhan proyek saat program sedang berjalan. Hal ini dapat menghilangkan kerugian dari kode yang sama yang menempati memori di banyak tempat yang disebabkan oleh unit.
2. Pembuatan perpustakaan DLL di Delphi
Dalam lingkungan Delphi, menulis DLL tidak jauh berbeda dengan menulis aplikasi pada umumnya. Faktanya, penulisan fungsi DLL sebagai bagian utama DLL tidak memerlukan cara khusus lainnya kecuali perbedaan dalam manajemen memori dan sumber daya.
Format file proyek umum adalah:
Judul proyek PROGRAM;
menggunakan klausa;
Badan program
Format file proyek DLL adalah:
judul proyek perpustakaan;
menggunakan klausa;
klausul ekspor;
Badan program
Ada dua perbedaan utama di antara keduanya:
1. Umumnya header file proyek menggunakan kata kunci program, sedangkan header file proyek DLL menggunakan kata kunci perpustakaan. Kata kunci yang berbeda memberitahu kompiler untuk menghasilkan file eksekusi yang berbeda. Kata kunci program digunakan untuk menghasilkan file .exe, dan kata kunci perpustakaan digunakan untuk menghasilkan file .dll;
2. Jika DLL ingin mengekspor fungsi atau prosedur untuk digunakan oleh aplikasi lain, fungsi atau prosedur tersebut harus tercantum dalam klausul ekspor. Fungsi atau prosedur ini sendiri harus dikompilasi menggunakan arahan kompilasi ekspor.
Pilih item baru... di file menu utama Delphi, klik dua kali ikon DLL di jendela pop-up, dan kerangka modul sumber DLL akan diberikan secara otomatis, sebagai berikut:
Proyek Perpustakaan1;
{...anotasi...}
kegunaan
SysUtils,Kelas;
mulai
akhir.
Selanjutnya, Anda dapat menambahkan definisi prosedur dan fungsi yang ingin Anda terapkan di DLL antara USES dan awal, dan menggunakan ekspor dan ekspor untuk mengekspornya sehingga modul lain dapat mereferensikannya. Tambahkan kode inisialisasi antara kode awal dan akhir digunakan untuk menginisialisasi variabel DLL. Perlu dicatat bahwa meskipun tidak ada kode inisialisasi, awal dan akhir tidak dapat dihilangkan, seperti pada contoh berikut:
perpustakaanminmax;
functionMin(X,Y:Integer):Integer;ekspor;
mulai
ifX<YthenMin:=XelseMin:=Y;
akhir;
functionMax(X,Y:Integer):Integer;ekspor;
mulai
ifX>YthenMax:=XelseMax:=Y;
akhir;
ekspor
Indeks Mini1,
Indeks Maksimum2;
mulai
akhir.
Setelah dikompilasi dan disimpan sebagai minmax.DLL, file perpustakaan DLL terbentuk.
Akses ke tiga perpustakaan DLL
Ada dua cara untuk mengakses perpustakaan DLL, satu adalah referensi statis dan yang lainnya adalah referensi dinamis.
Memuat DLL menggunakan metode referensi statis memerlukan dua hal: membuat unit masukan untuk pustaka DLL, dan menggunakan USES untuk menghubungkan unit masukan ke modul program tempat fungsi DLL akan digunakan. Satu-satunya perbedaan antara unit input yang dibuat untuk perpustakaan DLL dan unit biasa adalah bahwa prosedur dan fungsi yang dideklarasikan pada antarmukanya tidak memberikan kode implementasi sebenarnya di bagian implementasinya, tetapi menggunakan kata kunci eksternal untuk mendeklarasikan prosedur dan fungsi. Detail implementasi didelegasikan ke modul DLL eksternal.
Sintaks penggunaan perintah eksternal adalah sebagai berikut:
nama modul prosedur/fungsi prosedur/fungsi;
Berikut ini adalah file sumber unit masukan testdll.pas yang ditulis untuk pustaka minmax.DLL yang dibuat di atas. Dari situ kita dapat melihat beberapa perbedaan antara unit masukan dan unit umum.
unittestdll;
antarmuka
kegunaan
functionMin(X,Y:Bilangan Bulat):Bilangan Bulat;
functionMax(X,Y:Bilangan Bulat):Bilangan Bulat;
pelaksanaan
functionMin;external'minmax.DLL';
functionMax;eksternal'minmax.DLL';
akhir.
Jika suatu aplikasi ingin memanggil suatu fungsi di minmax.DLL, aplikasi hanya perlu menambahkan unit testdll ke pernyataan penggunaannya.
Memuat DLL secara dinamis memerlukan tiga fungsi API Windows. Loadlibrary, Freelibrary dan GetprocAddress. Fungsi loadlibrary digunakan untuk memuat perpustakaan DLL. Format pemanggilannya adalah sebagai berikut:
functionloadlobrary(DLLfileName:Pchar):Pegangan:
Ketika perpustakaan DLL tidak lagi diperlukan, fungsi FreeLibrary harus dipanggil untuk melepaskannya guna mengosongkan sumber daya memori yang berharga. Format pemanggilannya adalah sebagai berikut:
procedureFreeLibrary(Libmodule:THandle)
Libmodule adalah pegangan perpustakaan DLL yang diperoleh melalui panggilan LoadLibrary. Di segmen program antara memuat perpustakaan DLL dengan fungsi loadlobrary dan memanggil FreeLibrary untuk melepaskan perpustakaan DLL, Anda dapat menggunakan prosedur dan fungsi di perpustakaan DLL. Metode penggunaan khusus adalah: gunakan fungsi GetprocAddress untuk mendapatkan alamat fungsi di perpustakaan DLL. Teruskan ke variabel fungsi dalam program, lalu gunakan variabel tersebut untuk memanggil fungsi DLL. Fungsi GetprocAddress dideklarasikan sebagai berikut,
functionGetprocAddress(Libmodule:THandle:procname:pchar):TFarProc:
Seperti yang ditunjukkan pada contoh berikut:
jenis
TTimeRec=catatan
Kedua: Integer;
Menit:Bilangan Bulat;
Jam:Bilangan Bulat;
akhir;
TGetTime=prosedur(varTime:TTimeRec);
Pegangan=Bilangan Bulat;
var
Waktu:TTimeRec;
Pegangan: Pegangan;
DapatkanWaktu:TGetTime;
...
mulai
Tangani:=LoadLibrary('DATETIME.DLL');
jikaHandle<>0lalu
mulai
@GetTime:=GetProcAddress(Menangani,'GetTime');
if@GetTime<>nilthen
mulai
DapatkanWaktu(Waktu);
denganTimedo
WriteLn('Waktunya adalah',Jam,':',Menit,':',Kedua);
akhir;
Perpustakaan Gratis(Menangani);
akhir;
akhir;
Saat memanggil pustaka tautan dinamis, Anda harus memperhatikan bahwa pustaka tautan dinamis yang diperlukan harus berada di direktori yang sama dengan aplikasi atau di direktori WindowsSystem.
Pustaka tautan dinamis adalah cara penting untuk mengatur program di Windows. Menggunakan pustaka tautan dinamis dapat sangat melindungi pekerjaan yang dilakukan oleh pengguna di alat pengembangan yang berbeda dan pada waktu yang berbeda serta meningkatkan efisiensi pemrograman.