資源描述:
《delphi下寫dll大全》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、轉一篇Delphi下寫DLL的文章Delphi制作DLL一Dll的制作一般步驟二參數(shù)傳遞三DLL的初始化和退出清理[如果需要初始化和退出清理]四全局變量的使用五調用靜態(tài)載入六調用動態(tài)載入七在DLL建立一個TForM八在DLL中建立一個TMDIChildForM九示例:十Delphi制作的Dll與其他語言的混合編程中常遇問題:十一相關資料一Dll的制作一般分為以下幾步:1在一個DLL工程里寫一個過程或函數(shù)2寫一個Exports關鍵字,在其下寫過程的名稱。不用寫參數(shù)和調用后綴。二參數(shù)傳遞1參數(shù)類型最好與windowC++的參數(shù)類型一致。不要
2、用DELPHI的數(shù)據(jù)類型。2最好有返回值[即使是一個過程],來報出調用成功或失敗,或狀態(tài)。成功或失敗的返回值最好為1[成功]或0[失敗].一句話,與windowsc++兼容。3用stdcall聲明后綴。4最好大小寫敏感。5無須用far調用后綴,那只是為了與windows16位程序兼容。三DLL的初始化和退出清理[如果需要初始化和退出清理]1DLLProc[SysUtils單元的一個Pointer]是DLL的入口。在此你可用你的函數(shù)替換了它的入口。但你的函數(shù)必須符合以下要求[其實就是一個回調函數(shù)]。如下:procedureDllEnter
3、Point(dwReason:DWORD);far;stdcall;dwReason參數(shù)有四種類型:DLL_PROCESS_ATTACH:進程進入時DLL_PROCESS_DETACH:進程退出時DLL_THREAD_ATTACH:線程進入時DLL_THREAD_DETACH:線程退出時在初始化部分寫:?DLLProc:=@DLLEnterPoint;?DllEnterPoint(DLL_PROCESS_ATTACH);2如Form上有TdcomConnection組件,就UsesActivex,在初始化時寫一句CoInitialize
4、(nil);3在退出時一定保證DcomConnection.Connected:=False,并且數(shù)據(jù)集已關閉。否則報地址錯。四全局變量的使用在widnows32位程序中,兩個應用程序的地址空間是相互沒有聯(lián)系的。雖然DLL在內存中是一份,但變量是在各進程的地址空間中,因此你不能借助dll的全局變量來達到兩個應用程序間的數(shù)據(jù)傳遞,除非你用內存映像文件。五調用靜態(tài)載入1客戶端函數(shù)聲名:1)大小寫敏感。2)與DLL中的聲明一樣。??如:showform(form:Tform);Far;external'yproject_dll.dll';3)
5、調用時傳過去的參數(shù)類型最好也與windowsc++一樣。4)調用時DLL必須在windows搜索路徑中,順序是:當前目錄;Path路徑;windows;widowssystem;windowsssystem32;六調用動態(tài)載入1建立一種過程類型(或者是一個Function)[如果你對過程類型的變量只是一個指針的本質清楚的話,你就知道是怎么回事了]。如:type??mypointer=procedure(form:Tform);Far;external;??//mypointer=function(form:Tform);Far;ex
6、ternal;var?Hinst:Thandle;?showform:mypointer;begin??Hinst:=loadlibrary('yproject_dll');//Load一個Dll,按文件名找。??showform:=getprocaddress(Hinst,'showform');//按函數(shù)名找,大小寫敏感。如果你知道自動化對象的本質就清楚了。?showform(application.mainform);//找到函數(shù)入口指針就調用。?Freelibrary(Hinst);end;七在DLL建立一個TForM1把你的F
7、ormUses到Dll中,你的Form用到的關聯(lián)的單元也要Uses進來[這是最麻煩的一點,因為你的Form或許Uses了許多特殊的單元或函數(shù)]2傳遞一個Application參數(shù),用它建立Form.八在DLL中建立一個TMDIChildForM1Dll中的MDIForm.FormStyle不用為fmMDIChild.2在CreateForm后寫以下兩句:functionShowForm(mainForm:TForm):integer;stdcallvar?Form1:TForm1;?ptr:PLongInt;begin?ptr:=@(A
8、pplication.MainForm);//先把dll的MainForm句柄保存起來,也無須釋放,只不過是替換一下?ptr^:=LongInt(mainForm);//用主調程序的mainForm替換DL