Most popular

วันศุกร์ที่ 15 กรกฎาคม พ.ศ. 2554

Delphi กับการสร้างและใช้งานไฟล์ DLL (Dynamic Link Library)

การใช้ไฟล์ .dll หรือ Dynamic Linke Library ในระบบปฏิบัติการ Windows ดูเหมือนจะเป็นเรื่องที่หลีกเลี่ยงไม่ได้ หากต้องการให้โปรแกรมที่พัฒนาขึ้นมีความยืดหยุ่น และมีประสิทธิภาพมากที่สุด
ไฟล์ DLL นั้นในจุดประสงค์การใช้งานแล้ว ไม่ต่างจากการสร้าง Library ในการพัฒนาโปรแกรม แต่จะแตกต่างกันในรูปแบบของการใช้งาน เพราะ DLL เป็น Library ที่มีการทำให้เป็นภาษาเครื่องแล้ว และให้โปรแกรมอื่นๆสามารถเรียกใช้งานได้ เป็นการเรียกใช้ Library จากภายนอก

การเรียกใช้ DLL จาก Apllication
การพัฒนา DLL ขึ้นมาใช้งานสามารถใช้ภาษาใดในการพัฒนาก็ได้ เพราะอย่างไรก็ตามก็ต้อง Build ไปเป็นภาษาเครื่องอยู่ดี แต่อาจจะมี Type บางอย่างที่อาจคลาดเคลื่อนไปได้ อย่างเช่น หากพัฒนา DLL ด้วย Delphi การรับ - ส่งค่าตัวอักษร แทนที่จะใช้ String ก็จะต้องเปลี่ยนเป็น WideString แทน

ตัวอย่างการสร้างไฟล์ DLL ผู้เขียนจะใช้ไฟล์ DLL ในการเปิด และบันทึก Text File โดยการเรียกใช้จากโปรแกรมอื่น

สร้างไฟล์ Dynamic Link Library (.dll)
ผู้เขียนจะสร้างไฟล์ DLL จาก Delphi XE โดยการเลือกสร้าง Project เป็น Dynamic-link Library

จากนั้นผู้เขียนจะบันทึก Project เป็น myDLL

เมื่อบันทึกแล้วจะพบว่าชื่อ Project เปลี่ยนเป็น myDLL.dll
ส่วนของคำสั่งทั้งหมดของ DLL ผู้เขียนได้สร้าง 2 method คือ OpenFile และ SaveFile


library myDLL;


uses
  SysUtils,
  Dialogs,
  Classes;


{$R *.res}
    // method เปิดไฟล์ เมื่อเปิด Text File แล้วจะคืนค่า กลับไปเป็น WideString
    function OpenFile: WideString; stdcall;
    Var
       openDlg: TOpenDialog;
       fileText: TStringList;
    Begin
       try
         openDlg:=TOpenDialog.Create(nil);
         openDlg.Filter:='Text File|*.txt';
         fileText:=TStringList.Create;


         if openDlg.Execute then
           Begin
             if openDlg.FileName<>'' then
                //load Text ในไฟล์มาเก็บไว้ใน TStringList
                fileText.LoadFromFile(openDlg.FileName);
           End;
         Result:=fileText.Text;  //ส่ง WideString ออกไปจาก method
       finally
         FreeAndNil(openDlg);
         FreeAndNil(fileText);
       end;
    end;


    //method บันทึกไฟล์ ค่าที่ส่งเข้ามาคือชุดข้อความที่จะบันทึก
    procedure SaveFile(Value : WideString); export;
    Var
        saveDlg: TSaveDialog;
        fileSave: TStringList;
    begin
        try
           saveDlg:=TSaveDialog.Create(nil);
           fileSave:=TStringList.Create;
           if saveDlg.Execute then
             Begin
                 if saveDlg.FileName<>'' then
                   Begin
                     //นำ TStringList เข้ามาเก็บชุดข้อความที่ส่งเข้ามา
                     fileSave.Text:=Value;
                     //ให้ TStringList บันทึกลงไฟล์
                     fileSave.SaveToFile(saveDlg.FileName);
                   End;
             End;
        finally
           FreeAndNil(saveDlg);
           FreeAndNil(fileSave);
        end;
    end;


    //ประกาศชื่อ method ของ DLL
    exports OpenFile,SaveFile;


begin
end.


จากนั้นให้ Compile และ Build  Project จะเกิดไฟล์ myDLL.dll ขึ้นมา



การใช้งานไฟล์ Dynamic Link Library (.dll)
ผู้เขียนใช้ Delphi 7 ในการสร้างส่วนเรียกใช้งาน DLL โดยออกแบบฟอร์มตามภาพด้านล่างนี้

ประกอบด้วย TMainMenu และ TRichEdit
จากนั้นให้ประกาศ method โดยอ้างอิงไปที่ไฟล์ .dll โดยมีรูปแบบดังนี้

  • function ชื่อ method : ค่าที่ส่งกลับมา ;external 'Path ที่อยู่ของ DLL File'
  • procedure ชื่อ method(ค่าที่ส่งไป);external 'Path ที่อยู่ของ DLL File'


type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    OpenFile1: TMenuItem;
    SaveFile1: TMenuItem;
    RichEdit1: TRichEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;


  function OpenFile : WideString; stdcall; external 'D:\Project\Delphi\_project test\XEdll\Debug\Win32\myDLL.dll'
  procedure SaveFile(Value: WideString);external 'D:\Project\Delphi\_project test\XEdll\Debug\Win32\myDLL.dll'


คำสั่งเรียกใช้ DLL ผ่านเมนูที่สร้างขึ้น

//Event Click ของ เมนู Open File
procedure TForm1.OpenFile1Click(Sender: TObject);
begin
     Self.RichEdit1.Text:=OpenFile;
end;


//Event Click ของ เมนู Save File
procedure TForm1.SaveFile1Click(Sender: TObject);
begin
    SaveFile(Self.RichEdit1.Text);
end;

เมื่อรันโปรแกรมก็จะสามารถบันทึก และเปิด Text File ได้คล้ายๆกับโปรแกรม notepad

ทดสอบการบันทึกไฟล์ เป็น dllsave.txt
ตรวจสอบไฟล์ที่บันทึก
เปิดไฟล์ที่บันทึกไว้

ไม่มีความคิดเห็น:

แสดงความคิดเห็น