熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

Delphi學堂之用Delphi制作DLL小結

2013-11-23 17:29:10  來源: Delphi編程 
一 Dll的制作一般分為以下幾步
   在一個DLL工程裡寫一個過程或函數
   寫一個Exports關鍵字在其下寫過程的名稱不用寫參數和調用後綴
  
  二 參數傳遞
   參數類型最好與window C++的參數類型一致不要用DELPHI的數據類型
   最好有返回值[即使是一個過程]來報出調用成功或失敗或狀態成功或失敗的返回值最好為[成功]或[失敗]一句話與windows c++兼容
   用stdcall聲明後綴
   最好大小寫敏感
   無須用far調用後綴那只是為了與windows 位程序兼容
  
  三 DLL的初始化和退出清理[如果需要初始化和退出清理
   DLLProc[SysUtils單元的一個Pointer]是DLL的入口在此你可用你的函數替換了它的入口但你的函數必須符合以下要求[其實就是一個回調函數]如下
  procedure DllEnterPoint(dwReason: DWORD);far;stdcall;
  dwReason參數有四種類型
  DLL_PROCESS_ATTACH:進程進入時
  DLL_PROCESS_DETACH進程退出時
  DLL_THREAD_ATTACH 線程進入時
  DLL_THREAD_DETACH 線程退出時
  在初始化部分寫:
  DLLProc := @DLLEnterPoint;
  DllEnterPoint(DLL_PROCESS_ATTACH);
   如Form上有TdcomConnection組件就Uses Activex在初始化時寫一句CoInitialize (nil);
   在退出時一定保證DcomConnectionConnected := False並且數據集已關閉否則報地址錯
  
  四 全局變量的使用
  在widnows 位程序中兩個應用程序的地址空間是相互沒有聯系的雖然DLL在內存中是一份但變量是在各進程的地址空間中因此你不能借助dll的全局變量來達到兩個應用程序間的數據傳遞除非你用內存映像文件
  
  五 調用靜態載入
   客戶端函數聲名:
  )大小寫敏感
  )與DLL中的聲明一樣
  如 showform(form:Tform);Far;externalyproject_dlldll;
  )調用時傳過去的參數類型最好也與windows c++一樣
  )調用時DLL必須在windows搜索路徑中順序是當前目錄Path路徑windows;widows\system;windows\ssystem;
  
  六 調用動態載入
   建立一種過程類型[如果你對過程類型的變量只是一個指針的本質清楚的話你就知道是怎麼回事了]
  type
  mypointer=procedure(form:Tform);Far;external;
  var
  Hinst:Thandle;
  showform:mypointer;
  begin
  Hinst:=loadlibrary(yproject_dll);//Load一個Dll按文件名找
  showform:=getprocaddress(Hinstshowform);//按函數名找大小寫敏感如果你知道自動化對象的本質就清楚了
  showform(applicationmainform);//找到函數入口指針就調用
  Freelibrary(Hinst);
  end;
  
  七 在DLL建立一個TForM
   把你的Form Uses到Dll中你的Form用到的關聯的單元也要Uses進來[這是最麻煩的一點因為你的Form或許Uses了許多特殊的單元或函數]
   傳遞一個Application參數用它建立Form
  
  八 在DLL中建立一個TMDIChildForM
   Dll中的MDIFormFormStyle不用為fmMDIChild
   在CreateForm後寫以下兩句
  function ShowForm(mainForm:TForm):integer;stdcall
  var
  Form: TForm;
  ptr:PLongInt;
  begin
  ptr:=@(ApplicationMainForm);//先把dll的MainForm句柄保存起來也無須釋放只不過是替換一下
  ptr^:=LongInt(mainForm);//用主調程序的mainForm替換DLL的MainFormMainForm是特殊的WINDOW它專門管理Application中的Forms資源
  //為什麼不直接ApplicationMainForm := mainForm因為ApplicationMainForm是只讀屬性
  Form:=TFormCreate(mainForm);//用參數建立
  end;
  備注參數是主調程序的ApplicationMainForm
  
  九 示例
  DLL源代碼
  library Project;
  
  uses
  SysUtils
  Classes
  Dialogs
  Forms
  Unit in Unitpas {Form};
  
  {$R *RES}
  var
  ccc: Pchar;
  
  procedure OpenForm(mainForm:TForm);stdcall;
  var
  Form: TForm;
  ptr:PLongInt;
  begin
  ptr:=@(ApplicationMainForm);
  ptr^:=LongInt(mainForm);
  Form:=TFormCreate(mainForm);
  end;
  
  procedure InputCCC(Text: Pchar);stdcall;
  begin
  ccc := Text;
  end;
  
  procedure ShowCCC;stdcall;
  begin
  ShowMessage(String(ccc));
  end;
  
  exports
  OpenForm;
  InputCCC
  ShowCCC;
  begin
  end
  
  調用方源代碼
  unit Unit;
  
  interface
  
  uses
  Windows Messages SysUtils Classes Graphics Controls Forms Dialogs
  StdCtrls;
  
  type
  TForm = class(TForm)
  Button: TButton;
  Button: TButton;
  Edit: TEdit;
  procedure ButtonClick(Sender: TObject);
  procedure ButtonClick(Sender: TObject);
  private
  { Private declarations }
  public
  { Public declarations }
  end;
  
  var
  Form: TForm;
  
  implementation
  
  {$R *DFM}
  procedure OpenForm(mainForm:TForm);stdcall;Externalprojectdll;
  procedure ShowCCC;stdcall;Externalprojectdll;
  procedure InputCCC(Text: Pchar);stdcall;Externalprojectdll;
  
  procedure TFormButtonClick(Sender: TObject);
  var
  Text: Pchar;
  begin
  Text := Pchar(EditText);
  // OpenForm(ApplicationMainForm);//為了調MDICHILD
  InputCCC(Text);//為了實驗DLL中的全局變量是否在各個應用程序間共享
  end;
  
  procedure TFormButtonClick(Sender: TObject);
  begin
  ShowCCC;//這裡表明WINDOWS 位應用程序DLL中的全局變量也是在應用程序地址空間中位應用程序或許不同沒有做實驗
  end;
From:http://tw.wingwit.com/Article/program/Delphi/201311/24661.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.