Pada artikel sebelumnya kita telah membahas apa itu Dynamic Link Library dan bagaimana cara membuatnya di Delphi (baca: Mengenal Dynamic Link Library Di Delphi). Kini Anda telah mengerti bagaimana cara membuat file DLL Anda sendiri. Permasalahan yang paling mendasar sekarang, mungkin adalah bagaimana cara menggunakan file DLL yang telah Anda buat pada aplikasi Anda dan mendapatkan keuntungan darinya.
Terdapat dua cara penggunaan DLL, yakni Load-time dynamic lingking dan Run-time dynamic linking. Setelah membaca dan menerapkan contoh aplikasi sederhana dalam artikel ini, Anda akan dapat memahami perbedaan di antara kedua metode sehingga Anda dapat menentukan kapan menggunakan metode tersebut dan sebaliknya.
Load-time Dynamic Linking (Cara Implisit)
Jika Anda menggunakan cara ini, file DLL dimuat pada saat aplikasi dijalankan. Untuk melakukannya, Anda tinggal menulis prototype fungsi yang digunakan dengan tambahan pengarah eksternal. Sebagai contoh:
function FungsiDLL(InputText: PChar; var JumKar: Integer): PChar; external 'ExampleDLL.dll';Pengarah external menunjukkan bahwa fungsi berada pada file lain. Pengarah external diikuti dengan lokasi file. Dengan catatan, jika Anda mendeklarasikan fungsi externalyang menunjuk ke fungsi Windows API, tambahkan juga pengarah stdcall.
Sistem mencari file DLL dalam urutan lokasi sebagai berikut.
- Direktori di mana aplikasi dijalankan.
- Direktori aktif (current directory).
- Direktori sistem Windows.
- Direktori Windows.
- Direktori yang terdaftar pada path environment.
function FungsiDLL(InputText: PChar; var JumKar: Integer): PChar; external 'D:\Library\ExampleDLL.dll';
Perlu diperhatikan, nama fungsi bersifat case sensitive. Nama fungsi ini harus sesuai dengan nama file yang diekspor oleh file DLL. Berikut ini adalah contoh aplikasi sederhana untuk mengakses file DLL dengan metode load-time dynamic linking.
unit ULTDL; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Panel1: TPanel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function FungsiDLL(InputText: PChar; var JumKar: Integer): PChar; external 'ExampleDLL.dll'; procedure TForm1.Button1Click(Sender: TObject); var JumKar: Integer; // jumlah karakter DllMsg: String; // menampung string keluaran fungsi begin DllMsg:= String(FungsiDLL(PChar(Edit1.Text), JumKar)); Label2.Caption:= DllMsg; Label3.Caption:= 'Jumlah Karakter: ' + IntToStr(JumKar); end; end.
Run-time dynamic linking (cara eksplisit)
Tidak seperti load-time dynamic linking, pada metode run-time dynamic linking library dimuat ke memori hanya pada saat diperlukan saja. Setelah selesai digunakan, library dibebaskan kembali ke memori. Untuk memuat DLL ke memori menggunakan fungsi LoadLibrary() atau LoadLibraryEx(), sedangkan untuk memperoleh alamat memori menggunakan fungsi GetProcAddress().
Run-time dynamic linking memiliki beberapa keuntungan, antara lain:
- Pada aplikasi yang menggunakan metode load-time dynamic linking jika DLL yang diperlukan tidak ditemukan, aplikasi akan langsung ditutup, sedangkan aplikasi yang menggunakan metode run-time dynamic linking dapat melakukan penanganan kesalahan.
- Jika terjadi perubahan pada file DLL, aplikasi yang menggunakan metode load-time dynamic linking harus ditutup terlebih dahulu, kemudian aplikasi dijalankan kembali untuk mendapatkan keuntungan dari perubahan file DLL tersebut, sedangkan aplikasi yang menggunakan metode run-time dynamic linking hanya terpengaruh jika saat file DLL mengalami perubahan, sedang dimuat di memori.
Langkah-langkah yang ditempuh pada metode run-time dynamic linking adalah:
- Definisikan prototipe fungsi.
- Muat DLL ke memori dengan fungsi LoadLibrary(). LoadLibrary() menggunakan sebuah parameter yang menunjukkan lokasi file DLL. Urutan pencarian lokasi file sama seperti pada metode load-time dynamic linking. LoadLibrary() memberi nilai balik berupa handle yang diperoleh, sedangkan jika gagal bernilai nol.
- Simpan handle library pada sebuah variabel.
- Pastikan DLL sukses dimuat ke memori dengan memeriksa nilai handle library. Jika terdeteksi adanya kegagalan, tentukan penanganan kesalahannya.
- Cari pointer yang menunjuk ke lokasi memori DLL dengan menggunakan fungsi GetProcAddress(). GetProcAddress() menggunakan dua parameter, yakni handle DLL yang diperoleh dari LoadLibrary() dan nama fungsi yang dipanggil.
Catatan: nama fungsi bersifat case sensitive. Jika berhasil, akan mengembalikan nilai balik berupa alamat memori, sedangkan jika gagal, bernilai nil. - Tentukan penanganan kesalahan jika terdeteksi adanya kesalahan.
- Lakukan operasi dengan fungsi dari file DLL.
- Bebaskan memori dengan fungsi FreeLibrary()
Program berikut menunjukkan contoh implementasi dimana DLL dimuat ke memori hanya pada saat diperlukan dan dibebaskan dari memori jika telah selesai digunakan.
unit URTDL; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm2 = class(TForm) Edit1: TEdit; Button1: TButton; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); var DllHandle: THandle; // Handle dll FungsiDLL: function(InputText: PChar; var JumKar: Integer): PChar; DllMsg: String; JumKar: Integer; // jumlah karakter begin DllHandle:= LoadLibrary('ExampleDLL.dll'); // cek apakah library berhasil dibuka if (DllHandle = 0) then // jika gagal membuka DLL begin Application.MessageBox('Gagal membuka library', 'Kesalahan', MB_OK or MB_ICONEXCLAMATION); Exit; end; @FungsiDLL:= GetProcAddress(DllHandle, 'FungsiDLL'); // cek apakah fungsi spesifik ditemukan dalam memori if @FungsiDLL = nil then // jika gagal menemukan fungsi begin Application.MessageBox('Gagal membuka fungsi library', 'Kesalahan', MB_OK or MB_ICONEXCLAMATION); Exit; end; DllMsg:= FungsiDLL(PChar(Edit1.Text), JumKar); Label2.Caption:= DllMsg; Label3.Caption:= 'Jumlah Karakter: ' + IntToStr(JumKar); FreeLibrary(DllHandle); end; end.
Artikel diatas bagus sekali sobb izin copas ya ! TeknikKu-pedia
ReplyDeleteSangat membantu sekali .
Mohon kunjungi balik web kami dan meninggalkan komentarnya di TeknikKu-pedia
Ini juga bermanfaat loh
Klasifikasi Kabel Fiber Optic
Program Java
Bisnis Online
YouTube
https://cirebon-pedia.blogspot.co.id/
https://teknikku-pedia.blogspot.co.id/