一 Dll的制作一般分為以下幾步:
1 .在一個DLL工程裡寫一個過程或函數
2 .寫一個Exports關鍵字,在其下寫過程的名稱。不用寫參數和調用後綴。
二 參數傳遞
1 .參數類型最好與window C++的參數類型一致。不要用Delphi的數據類型。
2 .最好有返回值[即使是一個過程],來報出調用成功或失敗,或狀態。成功或失敗的返回值最好為1[成功]或0[失敗].一句話,與Windows c++兼容。
3 .用stdcall聲明後綴。
4 .最好大小寫敏感。
5 .無須用far調用後綴,那只是為了與Windows 16位程序兼容。
三 DLL的初始化和退出清理[如果需要初始化和退出清理]
1 .DLLProc[SysUtils單元的一個Pointer]是DLL的入口。在此你可用你的函數替換了它的入口。但你的函數必須符合以下要求[其實就是一個回調函數]。如下:
procedure DllEnterPoint(dwReason: DWord);far;stdcall;
DLLProc := @DLLEnterPoint;
DllEnterPoint(DLL_PROCESS_ATTACH);
四 全局變量的使用
在widnows 32位程序中,兩個應用程序的地址空間是相互沒有聯系的。雖然DLL在內存中是一份,但變量是在各進程的地址空間中,因此你不能借助dll的全局變量來達到兩個應用程序間的數據傳遞,除非你用內存映像文件。
五 調用靜態載入
1 客戶端函數聲名:
1)大小寫敏感。
六 調用動態載入
1 .建立一種過程類型[如果你對過程類型的變量只是一個指針的本質清楚的話,你就知道是怎麼回事了]。如:
type
mypointer=procedure(form:Tform);Far;external;
var
Hinst:Thandle;
showform:mypointer;
begin
Hinst:=loadlibrary('yproject_dll');//Load一個Dll,按文件名找。
showform:=getprocaddress(Hinst,'showform');//按函數名找,大小寫敏感。如果你知道自動化對象的本質就清楚了。
showform(application.mainform);//找到函數入口指針就調用。
Freelibrary(Hinst);
end;
八 .在DLL中建立一個TMDIChildForM
1 Dll中的MDIForm.FormStyle不用為fmMDIChild.
2 在CreateForm後寫以下兩句:
function ShowForm(mainForm:TForm):integer;stdcall
var
Form1: TForm1;
ptr:PLongInt;
begin
ptr:=@(Application.MainForm);//先把dll的MainForm句柄保存起來,也無須釋放,只不過是替換一下
ptr^:=LongInt(mainForm);//用主調程序的mainForm替換DLL的MainForm。MainForm