Skip to main content

Cara Menggunakan DLL Di Delphi

cara menggunakan dll di delphi

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.
Lokasi file library juga dapat dinyatakan secara absolut, misalnya:

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.

load-time dynamic linking


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.

run-time dynamic linking

Comments

  1. Artikel diatas bagus sekali sobb izin copas ya ! TeknikKu-pedia
    Sangat 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/

    ReplyDelete

Post a Comment

Popular posts from this blog

Pengenalan Dasar Qlik Sense

Dewasa ini konsep penyajian data informasi banyak mengalami perubahan yang menggembirakan. Jika dahulu, konsep penyajian data adalah dalam bentuk larik-larik data berisi teks dan biasanya tidak dinamis dan tidak interaktif. Sekarang, seiring dengan pertumbuhan data informasi yang masif, dibutuhkan sebuah teknik penyajian data yang semakin sederhana namun memuat banyak informasi, tersaji secara dinamis dan interaktif, menjadikan pekerjaan analisis data lebih menyenangkan dari sebelumnya. Di sinilah konsep Business Intelligence berawal. Idenya adalah, saya sajikan kepada Anda begitu banyak informasi yang tentu saja yang Anda butuhkan, dalam format visual yang bersih, informatif, dinamis, dan interaktif dalam layar komputer Anda. Qlik Sense merupakan sebuah Aplikasi Reporting untuk keperluan Bussiness Intelligence. Merupakan pengembangan dari aplikasi BI pendahulunya yaitu QlikView . Qlik Sense pada dasarnya sama dengan QlikView . Hanya saja Qlik Sense lebih menekankan pada ide

Cara Membuat Dan Menggunakan Unit Di Delphi

Artikel ini adalah lanjutan dari artikel Bekerja Dengan Unit Di Delphi .  Untuk membuat unit baru, pilih menu File | New | Unit . Listing di bawah ini merupakan suatu contoh unit yang dibuat Delphi. unit Unit2; interface implementation end.