版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、用Delphi制作DLL的方法一 Dll的制作一般步驟二參數(shù)傳遞三DLL的初始化和退出清理如果需要初始化和退出清理四全局變量的使用五調(diào)用靜態(tài)載入六調(diào)用動態(tài)載入七在DLL建立一個 TForM八在DLL中建立一個TMDIChildForM九示例:十Delphi制作的Dll與其他語言的混合編程中常遇問題: 十一相關(guān)資料 一 Dll的制作一般分為以下幾步:1在一個DLL工程里寫一個過程或函數(shù)2寫一個Exports關(guān)鍵字,在其下寫過程的名稱。不用寫參數(shù)和調(diào)用后綴。二參數(shù)傳遞1參數(shù)類型最好與 window C+的參數(shù)類型一致。不要用 DELPHI的數(shù)據(jù)類型。2最好有返回值即使是一個過程,來報出調(diào)用成功或失
2、敗,或狀態(tài)。成功或失敗的返回值 最好為1成功或0失敗一句話,與 windows C+兼容。3用stdcall聲明后綴。4最好大小寫敏感。5無須用far調(diào)用后綴,那只是為了與windows 16位程序兼容。三DLL的初始化和退出清理如果需要初始化和退出清理 1 DLLProcSysUtils單元的一個 Pointer是DLL的入口。在此你可用你的函數(shù)替換了它的入口。但你的函數(shù)必須符合以下要求其實就是一個回調(diào)函數(shù)。如下:procedure DllE nterPoi nt(dwReaso n: DWORD);far;stdcall;dwReason參數(shù)有四種類型:DLL_PROCESS_ATTACH
3、:進(jìn)程進(jìn)入時DLL_PROCESS_DETACH 進(jìn)程退出時DLL_THREAD_A TTACH 線程進(jìn)入時DLL_THREAD_DETACH線程退出時在初始化部分寫:DLLProc := DLLE nterPoi nt;DllE nterPoi nt(DLL_PROCESS_ATTACH);2 女口 Form 上有 TdcomConnection 組件,就 Uses ActiveX,在初始化時寫一句 Colnitialize (nil);3在退出時一定保證 DcomConnection.Connected := False,并且數(shù)據(jù)集已關(guān)閉。否則報地址錯。四全局變量的使用在widnows 3
4、2位程序中,兩個應(yīng)用程序的地址空間是相互沒有聯(lián)系的。雖然DLL在內(nèi)存中是一份,但變量是在各進(jìn)程的地址空間中,因此你不能借助dll的全局變量來達(dá)到兩個應(yīng)用程序間的數(shù)據(jù)傳遞,除非你用內(nèi)存映像文件。五調(diào)用靜態(tài)載入1客戶端函數(shù)聲名:1) 大小寫敏感。2) 與DLL中的聲明一樣。女口:showform(form:Tform);Far;externalyproject_dll.dll:3) 調(diào)用時傳過去的參數(shù)類型最好也與win dows C+ 一樣。4) 調(diào)用時DLL必須在 win dows搜索路徑中,順序是:當(dāng)前目錄;Path路徑;wi ndows;widowssystem;wi ndowsssyste
5、m32;六調(diào)用動態(tài)載入1建立一種過程類型如果你對過程類型的變量只是一個指針的本質(zhì)清楚的話,你就知道是 怎么回事了 。如:typemypoi nter=procedure(form:Tform);Far;external;varHin st:Tha ndle;showform:mypo in ter;beginHinst:=loadlibrary(yproject_dll);/Load一個 Dll,按文件名找。showform:=getprocaddress(Hinst,showform);按函數(shù)名找,大小寫敏感。如果你知道自動化 對象的本質(zhì)就清楚了。showform(application.m
6、ainform);/ 找到函數(shù)入口指針就調(diào)用。Freelibrary(Hi nst);en d;七在DLL建立一個 TForM1把你的Form Uses到Dll中,你的Form用到的關(guān)聯(lián)的單元也要Uses進(jìn)來這是最麻煩的一點,因為你的Form或許Uses 了許多特殊的單元或函數(shù)2傳遞一個 Application參數(shù),用它建立 Form.八在DLL中建立一個TMDIChildForM1 Dll 中的 MDIForm.FormStyle 不用為 fmMDIChild.2在CreateForm后寫以下兩句:function ShowForm(ma inFo rm:TForm):i nteger;st
7、dcallvarForm1: TForm1;ptr:PL onglnt;beginptr:=(Applicati on .Mai nForm);/ 先把dll的Mai nForm 句柄保存起來,也無須釋放,只不過是 替換一下ptrA:=Lo ngl nt(ma in Form);/ 用主調(diào)程序的 mai nF orm 替換 DLL 的 Mai nForm。 Ma in Form 是特 殊的 WINDOW,它專門管理 Application中的Forms資源./為什么不直接 Application.MainForm := mainForm, 因為 Application.MainForm 是只讀
8、屬性 Form1:=TForm1.Create(mainForm); 用參數(shù)建立en d;備注:參數(shù)是主調(diào)程序的Applicati on .Mai nForm九示例:DLL源代碼:library Project2;usesSysUtils,Classes,Dialogs,Forms,Unit2 in U ni t2.pas Form2;$R *.RESvarccc: Pchar;procedure OpenFo rm(ma inFo rm:TForm);stdcall;varForm1: TForm1;ptr:PL onglnt;beginptr:=(Applicati on.MainFo r
9、m);ptrA:=L on gl nt(mai nF orm);Form1:=TForm1.Create(mai nF orm);en d;procedure In putCCC(Text: Pchar);stdcall;beginccc := Text;en d;procedure ShowCCC;stdcall;beginShowMessage(Stri ng(ccc);en d;exportsOpenForm;In putCCC,ShowCCC;beginen d.調(diào)用方源代碼:unit Uni t1;in terfaceusesWin dows. Messages, SysUtils,
10、 Classes, Graphics, Con trols, Forms, Dialogs, StdCtrls;typeTForm1 = class(TForm)Butto n1: TButt on;Butto n2: TButt on;Edit1: TEdit;procedure Butto n1Click(Se nder: TObject);procedure Butto n2Click(Se nder: TObject);private Private declarati ons public Public declarati ons en d;varForm1: TForm1;impl
11、eme ntati on$R *.DFMprocedure OpenFo rm(ma inFo rm:TForm);stdcall;Exter nalproject2.dll: procedure ShowCCC;stdcall;Exter nalproject2.dll:procedure In putCCC(Text: Pchar);stdcall;Externalproject2.dll:procedure TForm1.Butt on 1Click(Se nder: TObject);varText: Pchar;beginText := Pchar(Edit1.Text);/ Ope
12、 nForm(Applicatio n. Mai nF orm); 為了調(diào) MDICHILDInputCCC(Text);/為了實驗DLL中的全局變量是否在各個應(yīng)用程序間共享 en d;procedure TForml.Butt on 2Click(Se nder: TObject);beginShowCCC;/這里表明WINDOWS 32位應(yīng)用程序DLL中的全局變量也是在應(yīng)用程序地址空 間中,16位應(yīng)用程序或許不同,沒有做實驗。en d;十Delphi制作的Dll與其他語言的混合編程中常遇問題:1與PowerBuilder混合編程在定義不定長動態(tài)數(shù)組方面在函數(shù)退出清理堆棧時老出現(xiàn)不可重現(xiàn)的地
13、址錯,原因未明,大概與PB的編譯器原理有關(guān),即使PB編譯成二進(jìn)制代碼也如此。Windows的執(zhí)行文件可以劃分為兩種形式程序和動態(tài)連接庫(DLLs)。一般程序運(yùn)行是用.EXE文件,但應(yīng)用程序有時也可以 調(diào)用存儲在DLL中的函數(shù)。當(dāng)我們調(diào)用 Windows中的API函數(shù)的時候,實際上就是調(diào)用 存儲在DLL中的函數(shù)。在如下幾種情況下,調(diào)用DLL是合理的:1) 不同的程序使用相同的DLL,這樣只需要將 DLL在內(nèi)存 中裝載一次,節(jié)省了內(nèi)存的開銷。2) 當(dāng)某些內(nèi)容需要升級的時候,如果使用DLL只需要改變 DLL就可以了,而不需要把整個程序都進(jìn)行變動。3)由于DLL是獨(dú)立于語言的,所以,當(dāng)不同語言習(xí)慣的人
14、共同開發(fā)一個大型項目的時候,使用DLL便于程序系統(tǒng)的交流,當(dāng)然,Delphi開發(fā)的DLL也可以在諸如Visual BASIC,C+等系 統(tǒng)中使用。下面通過幾個例子,說明Delphi開發(fā)動態(tài)連接庫的方法和規(guī)范。第一節(jié)動態(tài)連接庫的構(gòu)建和調(diào)用方法一、動態(tài)連接庫構(gòu)建File-New-Other-DLL Wizard這就創(chuàng)建了一個動態(tài)連接庫的基本模塊library Project2;usesSysUtils,Classes;$R *.resbeginen d.把工程名改為Mydll,并寫入必要的函數(shù)library mydll;usesSysUtils,Classes,Dialogs,w in dows;
15、fun ctio n Triple(N:l nteger):i nteger;stdcall;beginresult:=N+3;en d;fun ctio n Double(N:I nteger):i nteger;stdcall;beginresult:=N+2;en d;function Triple1(N:I nteger):i nteger;stdcall;beginshowmessage(計算 N+3); result:=N+3;en d;function Double1(N:I nteger):i nteger;stdcall;beginmessagebox(0,計算 N+2,計算
16、 N+2,mb_ok); result:=N+2;en d;exportsTriple n ame Tr,Double n ame Do,Triple1 name TrM,Double1 n ame DoM;Triple,Double,Triple1,Double1;$R *.RESbeginen d.其中函數(shù):Triple :把傳入值加三Double :把傳入值加二Triplel :把傳入值加三并顯示提示 Doublel :把傳入值加二并顯示提示從這個例子中可以看出DLL程序的幾個規(guī)則:1) 在DLL程序中,輸出函數(shù)必須被聲明為stdcall,以使用標(biāo)準(zhǔn)的Win32參數(shù)傳遞技術(shù)來代替優(yōu)化的R
17、egister。(說明:在Delphi中Register方式是缺省的調(diào)用約定,這個約 定盡量采用寄存器來傳遞參數(shù),傳遞次序從左到右,最多可用到3個CPU的寄存器,如果參數(shù)多于3個,剩下的就通過棧來傳送,使用寄存器傳送可保證參數(shù)傳遞的速度最快。而stdcall方式是通過 Windows的標(biāo)準(zhǔn)調(diào)用來傳遞參數(shù),傳遞 秩序從左到右,這種方式適合調(diào)用Windows的API ,在DLL中,當(dāng)然要使用這種方式)。2) 所有的輸出函數(shù)都必須列在exports子句下面,這使的子例程 在DLL外部就可以看到。exportsTriple n ame Tr,Double n ame Do,Triple1 name T
18、rM,Double1 n ame DoM;列出了用戶使用這個函數(shù)的接口名字。雖然別名不是必須的,但 最好給個別名,以便用戶程序更容易找到這個函數(shù),同時還要指出,Delphi 6.0取消了 Delphi 5.0中允許使用的index,如果還用Index 來指明接口名字,Delphi 6.0中將提示錯誤。實例中給出了兩種提示方法,主要想說明一個問題:showmessage(),是VCL提供的函數(shù),由于多次編譯VCL,做出的程序會比較大。而 messagebox(0,mb_ok) 是 Windows 提供的 API 函數(shù),做 出的程序會比較小。這就是說,編寫 DLL程序的時候,要盡量避免多次編譯VC
19、L。作為一個實例,這里把兩種方法都列出來了。保存編譯:Projrct-Build Mydll這就完成了一個簡單的動態(tài)連接庫的編寫。二、動態(tài)連接庫的調(diào)用首先在implementation下做調(diào)用聲明con stgdi32=mydll.dll:fun ctio n triple( n:in teger):i nteger;stdcall;external gdi32 n ame Tr: fun ctio n Double(N:l nteger):i nteger;stdcall;external gdi32 n ame Do; fun ctio n triple1( n:in teger):i n
20、teger;stdcall;external gdi32 n ame TrM; function Double1(N:I nteger):i nteger;stdcall;exter nal gdi32 n ame DoM;以后程序中就可以作為普通的函數(shù)使用了,例如:procedure TForm1.Butt on 1Click(Se nder: TObject); var N:i nteger;beginN:=updow n1.positi on;edit1.text:=i nttostr(triple(N); en d;第二節(jié) DLL中的Delphi窗體一、在DLL中放置窗的的方法在DLL
21、中,除了放置標(biāo)準(zhǔn)的函數(shù)和過程以外,也可以放置 已經(jīng)做好的的delphi窗體,也可以把做好的窗體供其它程序使 用,方法是:1) 首先按普通方法制作窗體,不過在in terface區(qū)域,對接口函數(shù)做如下聲明function Createform(capt:stri ng):stri ng;stdcall;2 )在implementation下加入接口函數(shù)function Createform(capt:stri ng):stri ng;stdcall;var Forml: TForml;beginform1:=Tform1.Create(applicatio n);form1.show;form1
22、.capti on:=capt;en d;3) 制作DLL動態(tài)連接庫,但要聲明:usesun it1 in un it1.pas:exports寫入接口標(biāo)示符Createform n ame Myform;4) 調(diào)用窗體的程序按普通方法制作,但是在implementation下首 先聲明要調(diào)用的 DLL函數(shù)con stgdi32=myFormdll.dll:fun ctio n Createform(capt:stri ng):stri ng;stdcall;external gdi32 n ame Myform;procedure TForm3.Butt on 1Click(Se nder:
23、 TObject);var n, m:stri ng;beginm:=我的窗體;Createform(m);var n,m:stri ng;en d;二、DLL中的調(diào)用窗體時的數(shù)據(jù)傳遞在窗體調(diào)用時,可以用普通的函數(shù)方法傳遞數(shù)據(jù),下面舉 個例子。1)建立窗體做一個改變顏色窗體,放在DLL中,可以用普通的方法來做,但要作如下聲明:fun ctio n mycolor(col:lo ngin t):l ongin t;stdcall;function Getcolor:l ongin t;stdcall;其中,mycolor為構(gòu)造窗體;Getcolor為傳遞顏色數(shù)據(jù)。在implementation區(qū)
24、聲明一個窗體內(nèi)全局的變量var color1:l ongint;下面寫出相應(yīng)的程序fun ctio n mycolor(col:l on gi nt):lo ngin t;stdcall;var Form1: TForm1;beginform1:=Tform1.Create(applicatio n);form1.show;form1.pa nel1.Color:=col;form1.edit1.Text:=in ttostr(form1.pa nel1.Color);result:=color1;en d;function Getcolor:l ongin t;stdcall;beginresult:=color1;en d;procedure
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年心理咨詢師題庫附參考答案ab卷 (一)
- 2024美容院美容產(chǎn)品網(wǎng)絡(luò)營銷合同范本2篇
- 環(huán)保設(shè)備與設(shè)計課程設(shè)計
- 2025年物業(yè)管理公司合同管理實施細(xì)則與社區(qū)圖書館運(yùn)營合同3篇
- 2025年智能廠房租賃合同范本及設(shè)備安裝服務(wù)條款3篇
- 2025年度智慧農(nóng)業(yè)合伙經(jīng)營合同4篇
- 2025年度智能家居系統(tǒng)全國代理商合作協(xié)議范本4篇
- 二零二五版新型城鎮(zhèn)化建設(shè)項目合伙承包合同模板3篇
- 二零二五年度美發(fā)店員工離職補(bǔ)償及安置合同4篇
- 2025年度智能廚房設(shè)備安裝與維護(hù)一體化勞務(wù)合同4篇
- 2024年工程咨詢服務(wù)承諾書
- 青桔單車保險合同條例
- 車輛使用不過戶免責(zé)協(xié)議書范文范本
- 《獅子王》電影賞析
- 2023-2024學(xué)年天津市部分區(qū)九年級(上)期末物理試卷
- DB13-T 5673-2023 公路自愈合瀝青混合料薄層超薄層罩面施工技術(shù)規(guī)范
- 河北省保定市定州市2025屆高二數(shù)學(xué)第一學(xué)期期末監(jiān)測試題含解析
- 哈爾濱研學(xué)旅行課程設(shè)計
- 2024 smart汽車品牌用戶社區(qū)運(yùn)營全案
- 中醫(yī)護(hù)理人文
- 2024-2030年中國路亞用品市場銷售模式與競爭前景分析報告
評論
0/150
提交評論