ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:20.58KB ,
资源ID:4146267      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4146267.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(如何用delphi制作DLL动态库方法.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

如何用delphi制作DLL动态库方法.docx

1、如何用delphi制作DLL动态库方法用DeIPhi制作DLL的方法一 Dll的制作一般步骤二参数传递三DLL的初始化和退出清理如果需要初始化和退出清理 四全局变量的使用五调用静态载入六调用动态载入七在DLL建立一个 TForM八在DLL中建立一个TMDIChiIdForM九示例:十DeIPhi制作的Dll与其他语言的混合编程中常遇问题: 十一相关资料 一 Dll的制作一般分为以下几步:1在一个DLL工程里写一个过程或函数2写一个EXPOrtS关键字,在其下写过程的名称。不用写参数和调用后缀。二参数传递1参数类型最好与 Window C+的参数类型一致。不要用 DELPHI的数据类型。2最好有

2、返回值即使是一个过程,来报出调用成功或失败,或状态。成功或失败的返回值 最好为1成功或0失败 一句话,与 Windows c+兼容。3用Stdcall声明后缀。4最好大小写敏感。5无须用far调用后缀,那只是为了与 Windows 16位程序兼容。三DLL的初始化和退出清理如果需要初始化和退出清理 1DLLProcSysUtils单元的一个 Pointer是DLL的入口。在此你可用你的函数替换了它的入口。但你的函数必须符合以下要求 其实就是一个回调函数。如下:PrOCedUre DllE nterPoi nt(dwReaso n: DWoRD);far;StdCaII;dwReason参数有四

3、种类型:DLL_PROCESS_ATTACH:进程进入时DLL_PROCESS_DETACH 进程退出时DLL_THREAD_A TTACH 线程进入时DLL_THREAD_DETACH 线程退出时在初始化部分写:DLLPrOC := DLLE nterPoi nt;DIIE nterPoi nt(DLL_PROCESS_ATTACH);2女口 Form 上有 TdCOmCOnnectiOn 组件,就 USeS Activex,在初始化时写一句 CoInitialize (nil);3在退出时一定保证 DcomConnection.Connected := False,并且数据集已关闭。否则报

4、地址错。四全局变量的使用在Widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。 虽然DLL在内存中是一份,但变量是在各进程的地址空间中,因此你不能借助 dll的全局变量来达到两个应用程序间的数据传递,除非你用内存映像文件。五调用静态载入1客户端函数声名:1)大小写敏感。2)与DLL中的声明一样。女口: ShoWform(form:Tform);Far;externalyproject_dll.dll:3)调用时传过去的参数类型最好也与 Win dows c+ 一样。4)调用时DLL必须在 Win dows搜索路径中,顺序是:当前目录;Path路径;Wi ndows;WidoW

5、Ssystem;Wi ndowsssystem32;六调用动态载入1建立一种过程类型如果你对过程类型的变量只是一个指针的本质清楚的话,你就知道是 怎么回事了 。如:typemypoi nter=procedure(form:Tform);Far;external;VarHin st:Tha ndle;showform:mypo in ter;beginHinst:=Ioadlibrary(yproject_dll);Load 个 Dll,按文件名找。ShoWform:=getprocaddress(Hinst,showform);/按函数名找,大小写敏感。如果你知道自动化 对象的本质就清楚了。

6、showform(application.mainform);/ 找到函数入口指针就调用。FreeIibrary(Hi nst);en d;七在DLL建立一个 TForM1把你的Form USeS到Dll中,你的Form用到的关联的单元也要 USeS进来这是最麻烦的一点,因为你的Form或许USeS 了许多特殊的单元或函数2传递一个 APPIiCatiOn参数,用它建立 Form.八在DLL中建立一个TMDIChildForM1 Dll 中的 MDIForm.FormStyIe 不用为 fmMDIChild.2在CreateFOrm后写以下两句:function ShowForm(ma inF

7、o rm:TForm):i nteger;StdCaIlVarForm1: TForm1;ptr:PL Onglnt;beginptr:=(APPIiCatiOn.MainForm);/ 先把dll的MainForm 句柄保存起来,也无须释放,只不过是 替换一下ptr:=Lo ngl nt(ma in Form);/ 用主调程序的 mai nF Orm 替换 DLL 的 Mai nForm。 Ma in Form 是特 殊的 WlNDoW ,它专门管理 APPIiCatiOn中的Forms资源./为什么不直接 APPIiCation.MainForm := mainForm, 因为 APPIi

8、Cation.MainForm 是只读属性 Form1:=TForm1.Create(mainForm);/ 用参数建立en d;备注:参数是主调程序的 APPIiCati On .Mai nForm九示例:DLL源代码:Iibrary 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:=(

9、APPIiCati on.MainFo rm);ptr:=L On gI nt(mai nF orm);Form1:=TForm1.Create(mai nF orm);en d;PrOCedUre In PUtCCC(Text: PChar);StdCaII;beginCCC := Text;en d;PrOCedUre ShOWCCC;StdCaII;beginShOWMeSSage(Stri ng(ccc);en d;exportsOPenForm;In PUtCCC,ShOWCCC;beginen d.调用方源代码:UnitUni t1;in terfaceUSeSWin dows,

10、Messages, SysUtils, Classes, Graphics, Con trols, Forms, Dialogs, StdCtrls;typeTForm1 = CIaSS(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 PUbIiC PUbIiC declarati OnS en d;Va

11、rForm1: TForm1;impleme 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

12、(Edit1.Text);/ OPenForm(Application.MainForm);/ 为了调 MDlCHILDInputCCC(Text);/为了实验DLL中的全局变量是否在各个应用程序间共享 en d;ProCedUre TForm1.Butt On 2Click(Se nder: TObject);beginShOWCCC;/这里表明WlNDoWS 32位应用程序DLL中的全局变量也是在应用程序地址空 间中,16位应用程序或许不同,没有做实验。en d;十DeIPhi制作的Dll与其他语言的混合编程中常遇问题:1与POWerBUiIder混合编程在定义不定长动态数组方面在函数退出

13、清理堆栈时老出现不可重现的地址错, 原因未明,大概与PB的编译器原理有关,即使 PB编译成二进制代码也如此。Windows的执行文件可以划分为两种形式程序和动态连接库(DLLS)。一般程序运行是用.EXE文件,但应用程序有时也可以 调用存储在DLL中的函数。当我们调用 Windows中的API函数的时候,实际上就是调用 存储在DLL中的函数。在如下几种情况下,调用 DLL是合理的:1) 不同的程序使用相同的 DLL ,这样只需要将 DLL在内存 中装载一次,节省了内存的开销。2) 当某些内容需要升级的时候,如果使用 DLL只需要改变 DLL就可以了,而不需要把整个程序都进行变动。3) 由于DL

14、L是独立于语言的,所以,当不同语言习惯的人共同开发一个大型项目的时候,使用 DLL便于程序系统的交流,当然,DeIPhi开发的DLL也可以在诸如ViSUaI BASIC,C+等系 统中使用。下面通过几个例子,说明 DeIPhi开发动态连接库的方法和规范。第一节动态连接库的构建和调用方法一、动态连接库构建File-New-Other-DLL WiZard这就创建了一个动态连接库的基本模块Iibrary PrOjeCt2;USeSSySUtiIs, Classes;$R *.resbeginen d.把工程名改为Mydll ,并写入必要的函数Iibrary mydll;USeSSySUtiISQa

15、SSeS,Dialogs,w in dows;fun ctio n TriPIe(N:1 nteger):i nteger;StdCaII;begin resuIt:=N+3;en d;fun ctio n DoubIe(N:I nteger):i nteger;StdCaII;begin resuIt:=N+2;en d;function TriPIe1(N:I nteger):i nteger;StdCaII;beginShOWmeSsage(计算 N+3); resuIt:=N+3;en d;function DoubIe1(N:I nteger):i nteger;StdCaII;be

16、ginmessagebox(0,计算 N+2,计算 N+2,mb_ok); resuIt:=N+2;en d;exportsTriPIe n ame Tr,Double n ame Do,TriPIeI name TrM,Double1 n ame DoM;TriPIe,DoubIe,TripIe1,DoubIe1;$R *.RESbeginen d.其中函数:TriPIe :把传入值加三Double :把传入值加二TriPleI :把传入值加三并显示提示 DoUbleI :把传入值加二并显示提示从这个例子中可以看出 DLL程序的几个规则:1) 在DLL程序中,输出函数必须被声明为 StdCa

17、Il ,以使用标准的Win32参数传递技术来代替优化的 RegiSterO(说明:在DeIPhi中RegiSter方式是缺省的调用约定,这个约定尽量采用寄存器来传递参数,传递次序从左到右,最多可用到 3个CPU的寄存器,如果参数多于 3个,剩下的就通过栈来传送,使用寄存器传送可保证参数传递的速度最快。而Stdcall方式是通过Windows的标准调用来传递参数,传递秩序从左到右,这种方式适合调用 Windows的APl ,在DLL中,当然要使用这种方式)。2)所有的输出函数都必须列在 exports子句下面,这使的子例程 在DLL外部就可以看到。exportsTriPIe n ame Tr,D

18、ouble n ame Do,TriPIeI name TrM, Double1 n ame DoM;列出了用户使用这个函数的接口名字。虽然别名不是必须的,但最好给个别名,以便用户程序更容易找到这个函数,同时还要指出,DeIPhi 6.0取消了 DeIPhi 5.0中允许使用的index ,如果还用Index 来指明接口名字,DeIPhi 6.0中将提示错误。实例中给出了两种提示方法,主要想说明一个问题:ShOWmeSSage(),是VCL提供的函数,由于多次编译 VCL ,做出 的程序会比较大。而 messagebox(0,mb_ok) 是 Windows 提供的 API 函数,做 出的程序

19、会比较小。这就是说,编写 DLL程序的时候,要尽量避免多次编译 VCL。作为一个实例,这里把两种方法都列出来了。保存编译:ProjrCt-Build Mydll这就完成了一个简单的动态连接库的编写。二、动态连接库的调用首先在implementation下做调用声明Con Stgdi32=mydll.dll;fun ctio n triple( n:in teger):i nteger;StdCaIl;external gdi32 n ame Tr; fun ctio n DoUbIe(N:1 nteger):i nteger;StdCaIl;external gdi32 n ame Do; f

20、un ctio n triple1( n:in teger):i nteger;StdCaIl;external gdi32 n ame TrM; function Double1(N:I nteger):i nteger;StdCaIl;exter nal gdi32 n ame DoM;以后程序中就可以作为普通的函数使用了,例如:PrOCedUre TForm1.Butt On 1CIick(Se nder: TObject); Var N:i nteger;beginN:=updow n1.positi on;edit1.text:=i nttostr(triple(N); en d;第

21、二节 DLL中的DeIPhi窗体一、在DLL中放置窗的的方法在DLL中,除了放置标准的函数和过程以外,也可以放置 已经做好的的delphi窗体,也可以把做好的窗体供其它程序使 用,方法是:1)首先按普通方法制作窗体,不过在 in terface区域,对接 口函数做如下声明function CreatefOrm(Capt:Stri ng):Stri ng;StdCaII;2)在implementation下加入接口函数function Createform(Capt:Stri ng):Stri ng;StdCalI;Var Form1: TForm1;beginform1:=Tform1.Cre

22、ate(applicatio n);form1.show;form1.capti on:=capt;en d;3)制作DLL动态连接库,但要声明:USeSUn it1 in un it1.pas;exports写入接口标示符CreatefOrm n ame Myform;4) 调用窗体的程序按普通方法制作,但是 在implementation下首 先声明要调用的 DLL函数Con Stgdi32=myFormdll.dll;fun ctio n CreatefOrm(Capt:Stri ng):Stri ng;StdCaIl;external gdi32 n ame Myform;PrOCed

23、Ure TForm3.Butt On 1Click(Se nder: TObject);Var n, m:Stri ng;beginm:=我的窗体;Createform(m);Var n,m:Stri ng;en d;二、DLL中的调用窗体时的数据传递在窗体调用时,可以用普通的函数方法传递数据,下面举 个例子。1)建立窗体做一个改变颜色窗体,放在 DLL中,可以用普通的方法来做,但要作如下声明:fun Ctio n mycolor(col:lo ngin t):l Ongin t;StdCalI;function GetCoIor:1 Ongin t;StdCall;其中,mycolor为构造

24、窗体;Getcolor为传递颜色数据。在implementatiOn区声明一个窗体内全局的变量Var CoIor1:1 Ongint;下面写出相应的程序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:=CoIor1;en d;function

25、 Getcolor:l Ongin t;StdCall;beginresult:=CoIor1;en d;PrOCedUre TForm1.ScrollBar1Cha nge(Se nder: TObject);beginPan eI2.CoIor:=RGB(SCroIIBar1.Positio n,ScrollBar2 .P ositio n,ScrollBar3 .P ositio n); edit2.Text:=i nttostr(pa nel2.Color);color1:=Pa nel2.Color;en d;PrOCedUre TForm1.Butt On 2CIick(Se nd

26、er: TObject);beginFree; /析构 Form1en d;2)建立动态连接库运行成功后,再建立动态连接库:Iibrary FormDLL;从文件调入USeSUn it1 in un it1.pas;exports写入接口标示符MyColor name My, Getcolor n ame Get;beginen d.3)建立调用的程序首先声明要调用的 DLL函数Con Stgdi32=formDll.dll;fun ctio n MyCoIor(Col:lo ngi nt):l On gi nt;StdCaIl;external gdi32 n ame My; fun ctio n Getcolor:lo ngi nt;StdCaIl;external gdi32 n ame Get;然后写出相应的程序PrOCedUre TForm1.Butt On 1Click(Se nder: TObject);beginMycolor(color);en d;PrOCedUre TForm1.Butt On 2Click(Se nder: TObject);begincolor:=getcolor;en d;我们可以看到,在改变颜色的窗体中做了颜色变化后,当前窗 体的颜色将发生变化。han dle

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1