制作動態鏈接庫的壹般步驟
雙參數轉移
三個dll的初始化和退出清理[如果需要初始化和退出清理]
四個全局變量的使用
五調用靜態加載
動態加載的六個調用
7.在DLL中創建壹個TForM。
八、在DLL中創建壹個TMDIChildForM。
九個例子:
Delphi與其他語言混合編程Dll的十個常見問題:
XI。相關信息
Dll的生成通常分為以下步驟:
1在DLL項目中編寫壹個過程或函數。
2編寫壹個Exports關鍵字,並在它下面寫下進程的名稱。不需要寫參數和調用後綴。
雙參數轉移
1的參數類型應該和window C++的參數類型相同。不要使用DELPHI數據類型。
最好有壹個返回值(甚至是壹個過程)來報告調用的成功或失敗,或者狀態。成功或失敗的返回值最好是1[成功]或0[失敗]。總之,是兼容windows c++的。
3用stdcall聲明後綴。
4最好區分大小寫。
不需要使用far後綴,這只是為了與windows 16位程序兼容。
三個dll的初始化和退出清理[如果需要初始化和退出清理]
1 DLL proc[sysutils單元的壹個指針]是DLL的入口。在這裏,您可以用您的函數替換它的條目。但是妳的函數必須滿足以下要求【其實是回調函數】。如下所示:
過程DllEnterPoint(dw reason:DWORD);遠;stdcall
有四種類型的dwReason參數:
DLL_PROCESS_ATTACH:進程進入時。
當DLL_PROCESS_DETACH進程退出時。
當DLL_THREAD_ATTACH線程進入
當DLL_THREAD_DETACH線程退出時。
在初始化部分,寫入:
DLLProc:= @ DLLEnterPoint;
DllEnterPoint(DLL _ PROCESS _ ATTACH);
2如果表單上有TdcomConnection組件,則在初始化時使用Activex並寫入壹個CoInitialize (nil );
確保DCOM的聯系。connected: = false,退出時數據集關閉。否則地址就是錯的。
四個全局變量的使用
在widnows 32位程序中,兩個應用程序的地址空間互不相關。雖然dll是內存中的副本,但是變量是在每個進程的地址空間中,所以妳不能使用DLL的全局變量來實現兩個應用程序之間的數據傳輸,除非妳使用內存鏡像文件。
五調用靜態加載
1客戶端功能信譽:
1)區分大小寫。
2)與DLL中的聲明相同。
如:showform(form:t form);遠;外部“y project _ dll . dll”;
3)調用中傳遞的參數類型也與windows c++相同。
4)調用時DLL必須在windows搜索路徑中,順序為:當前目錄;路徑path;windows寡婦\系統;windows \ ssystem32
動態加載的六個調用
1建立壹個進程類型【如果妳知道進程類型變量的本質只是壹個指針,妳就知道是怎麽回事了】。比如:
類型
my pointer = procedure(form:t form);遠;外部;
定義變量
hinst:Thandle;
showform:my pointer;
開始
hinst:= loadlibrary(' y project _ dll ');//加載壹個Dll,按文件名查找。
showform:=getprocaddress(Hinst,' showform ');//按函數名查找,區分大小寫。如果妳知道自動化對象的本質,這壹點就很清楚了。
showform(application . mainform);//找到函數入口指針時調用。
免費圖書館(Hinst);
結束;
7.在DLL中創建壹個TForM。
1把妳的窗體用到Dll中,妳的窗體中使用的關聯單元也要用到【這是最麻煩的壹點,因為妳的窗體可能會用到很多特殊的單元或者函數】。
傳遞壹個應用程序參數並使用它來創建壹個表單。
八、在DLL中創建壹個TMDIChildForM。
MDIForm。1 Dll中的FormStyle不需要是fmMDIChild。
2在CreateForm後寫下以下兩句話:
函數ShowForm(main form:t form):integer;stdcall
定義變量
form 1:t form 1;
ptr:PLongInt;
開始
ptr:=@(應用。MainForm);//先保存dll的MainForm句柄,不釋放,只替換。
ptr^:=longint(mainform);//用主調用程序的主窗體替換DLL的主窗體。主窗體是壹個特殊的窗口,專門管理應用程序中的窗體資源。
//為什麽不直接應用。MainForm := mainForm,因為應用。MainForm是只讀屬性。
Form1:=TForm1。創建(主窗體);//用參數創建
結束;
註意:參數是應用程序。調用程序的主窗體。
九個例子:
DLL源代碼:
圖書館項目2;
使用
SysUtils,
班級,
對話框,
表格,
“unit 2 . pas“{ form 2 }”中的Unit2
{$R *。RES}
定義變量
CCC:Pchar;
過程open form(main form:t form);stdcall
定義變量
form 1:t form 1;
ptr:PLongInt;
開始
ptr:=@(應用。MainForm);
ptr^:=longint(mainform);
Form1:=TForm1。創建(主窗體);
結束;
過程input cc(Text:Pchar);stdcall
開始
CCC:= Text;
結束;
程序顯示CCC;stdcall
開始
ShowMessage(字符串(CCC));
結束;
出口
OpenForm
輸入CC,
ShowCCC
開始
結束。
調用者源代碼:
單位unit 1;
連接
使用
窗口、消息、系統、類、圖形、控件、表單、對話框,
StdCtrls
類型
TForm1 = class(TForm)
button 1:TButton;
button 2:t button;
edit 1:TEdit;
程序按鈕1Click(發件人:to object);
過程按鈕2Click(發送方:to object);
私人的
{私人聲明}
公眾的
{公開聲明}
結束;
定義變量
form 1:t form 1;
履行
{$R *。DFM}
過程open form(main form:t form);stdcall外部“project 2 . dll”;
程序顯示CCC;stdcall外部“project 2 . dll”;
過程input cc(Text:Pchar);stdcall外部“project 2 . dll”;
程序TForm1。Button1Click(發件人:to object);
定義變量
正文:Pchar
開始
Text := Pchar(Edit1。正文);
// OpenForm(應用程序。MainForm);//為了調整MDICHILD
InputCCC(文本);//為了測試DLL中的全局變量是否* * *在各個應用之間共享。
結束;
程序TForm1。Button2Click(發送方:to object);
開始
ShowCCC//這說明WINDOWS 32位應用程序DLL中的全局變量也在應用程序地址空間中,16位應用程序可能不壹樣,所以沒有做實驗。
結束;