ITPub博客

首页 > 应用开发 > IT综合 > Delphi制作DLL

Delphi制作DLL

IT综合 作者:niuchao 时间:2019-04-17 13:03:05 0 删除 编辑
 

Delphi制作DLL

一 Dll的制作一般步骤
二 参数传递
三 DLL的初始化和退出清理[如果需要初始化和退出清理]
四 全局变量的使用
五 调用静态载入
六 调用动态载入
七 在DLL建立一个Tform
八 在DLL中建立一个TMDIChildform
九 示例:
十 Delphi制作的Dll与其他语言的混合编程中常遇问题:
十一 相关资料


一 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;
dwReason参数有四种类型:
DLL_PROCESS_ATTACH:进程进入时
DLL_PROCESS_DETACH:进程退出时
DLL_THREAD_ATTACH :线程进入时
DLL_THREAD_DETACH :线程退出时


在初始化部分写:
DLLProc := @DLLEnterPoint;
DllEnterPoint(DLL_PROCESS_ATTACH);


2 如form上有TdcomConnection组件,就Uses Activex,在初始化时写一句CoInitialize (nil);
3 在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。

四 全局变量的使用
在widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中是一份,但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用程序间的数据传递,除非你用内存映像文件。

五 调用静态载入
1 客户端函数声名:
1)大小写敏感。
2)与DLL中的声明一样。
如: showform(form:Tform);Far;external'yproject_dll.dll';
3)调用时传过去的参数类型最好也与windows c++一样。
4)调用时DLL必须在windows搜索路径中,顺序是:当前目录;Path路径;windows;widows\system;windows\ssystem32;

六 调用动态载入
1 建立一种过程类型(或者是一个Function)[如果你对过程类型的变量只是一个指针的本质清楚的话,你就知道是怎么回事了]。如:

[delphi] view plaincopy
  1. type  
  2. mypointer=procedure(form:Tform);Far;external;   
  3. //mypointer=function(form:Tform);Far;external;  
  4.   
  5. var  
  6.   Hinst:Thandle;  
  7.   showform:mypointer;  
  8. begin  
  9.    Hinst:=loadlibrary('yproject_dll');//Load一个Dll,按文件名找。  
  10.    showform:=getprocaddress(Hinst,'showform');//按函数名找,大小写敏感。如果你知道自动化对象的本质就清楚了。  
  11.    showform(application.mainform);//找到函数入口指针就调用。  
  12.    Freelibrary(Hinst);  
  13. end;  



七 在DLL建立一个Tform
1 把你的form Uses到Dll中,你的form用到的关联的单元也要Uses进来[这是最麻烦的一点,因为你的form或许Uses了许多特殊的单元或函数]
2 传递一个Application参数,用它建立form.

八 在DLL中建立一个TMDIChildform
1 Dll中的MDIform.formstyle不用为fmMDIChild.
2 在Createform后写以下两句:

[delphi] view plaincopy
  1. function Showform(mainform:Tform):integer;stdcall  
  2. var  
  3.   form1: Tform1;  
  4.   ptr:PLongInt;  
  5. begin  
  6.   ptr:=@(Application.Mainform);//先把dll的Mainform句柄保存起来,也无须释放,只不过是替换一下  
  7.   ptr^:=LongInt(mainform);//用主调程序的mainform替换DLL的Mainform。Mainform是特殊的WINDOW,它专门管理 Application中的forms资源.  
  8. //为什么不直接Application.Mainform := mainform,因为Application.Mainform是只读属性  
  9.   form1:=Tform1.Create(mainform);//用参数建立  
  10. end;  
  11. 备注:参数是主调程序的Application.Mainform  



九 示例:
DLL源代码:

 

[delphi] view plaincopy
  1. library Project2;  
  2.   
  3. uses  
  4. SysUtils,  
  5. Classes,  
  6. Dialogs,  
  7. forms,  
  8. Unit2 in 'Unit2.pas' {form2};  
  9.   
  10. {$R *.RES}  
  11. var  
  12. ccc: Pchar;  
  13.   
  14. procedure Openform(mainform:Tform);stdcall;  
  15. var  
  16.   form1: Tform1;  
  17.   ptr:PLongInt;  
  18. begin  
  19.   ptr:=@(Application.Mainform);  
  20.   ptr^:=LongInt(mainform);  
  21.   form1:=Tform1.Create(mainform);  
  22. end;  
  23.   
  24. procedure InputCCC(Text: Pchar);stdcall;  
  25. begin  
  26.   ccc := Text;  
  27. end;  
  28.   
  29. procedure ShowCCC;stdcall;  
  30. begin  
  31.   ShowMessage(String(ccc));  
  32. end;  
  33.   
  34. exports  
  35.   Openform;  
  36.   InputCCC,  
  37.   ShowCCC;  
  38.   
  39.   
  40. begin  
  41. end.  
  42.   
  43. 调用方源代码:  
  44. unit Unit1;  
  45.   
  46. interface  
  47.   
  48. uses  
  49. Windows, Messages, SysUtils, Classes, Graphics, Controls, forms, Dialogs,  
  50. StdCtrls;  
  51.   
  52. type  
  53. Tform1 = class(Tform)  
  54. Button1: TButton;  
  55. Button2: TButton;  
  56. Edit1: TEdit;  
  57. procedure Button1Click(Sender: TObject);  
  58. procedure Button2Click(Sender: TObject);  
  59. private  
  60. { Private declarations }  
  61. public  
  62. { Public declarations }  
  63. end;  
  64.   
  65. var  
  66. form1: Tform1;  
  67.   
  68. implementation  
  69.   
  70. {$R *.DFM}  
  71. procedure Openform(mainform:Tform);stdcall;External'project2.dll';  
  72. procedure ShowCCC;stdcall;External'project2.dll';  
  73. procedure InputCCC(Text: Pchar);stdcall;External'project2.dll';  
  74.   
  75. procedure Tform1.Button1Click(Sender: TObject);  
  76. var  
  77.   Text: Pchar;  
  78. begin  
  79.   Text := Pchar(Edit1.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/166523/viewspace-1311484/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2004-11-04

  • 博文量
    141
  • 访问量
    136184