天天加油 - 助您成才
Delphi学堂之用Delphi制作DLL小结
您正在看的DELPHI是:Delphi学堂之用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 建立一种过程类型[如果你对过程类型的变量只是一个指针的本质清楚的话,你就知道是怎么回事了]。如:
  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建立一个TForM
  1 把你的Form Uses到Dll中,你的Form用到的关联的单元也要Uses进来[这是最麻烦的一点,因为你的Form或许Uses了许多特殊的单元或函数]
  2 传递一个Application参数,用它建立Form.
  
  八 在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是特殊的WINDOW,它专门管理Application中的Forms资源.
  //为什么不直接Application.MainForm := mainForm,因为Application.MainForm是只读属性
  Form1:=TForm1.Create(mainForm);//用参数建立
  end;
  备注:参数是主调程序的Application.MainForm
  
  九 示例:
  DLL源代码:
  library Project2;
  
  uses
  SysUtils,
  Classes,
  Dialogs,
  Forms,
  Unit2 in 'Unit2.pas' {Form2};
  
  {$R *.RES}
  var
  ccc: Pchar;
  
  procedure OpenForm(mainForm:TForm);stdcall;
  var
  Form1: TForm1;
  ptr:PLongInt;
  begin
  ptr:=@(Application.MainForm);
  ptr^:=LongInt(mainForm);
  Form1:=TForm1.Create(mainForm);
  end;
  
  procedure InputCCC(Text: Pchar);stdcall;
  begin

排行

  1. vb的属性、方法和事件(二)
  2. vb的属性、方法和事件(一)
  3. vb对象的使用
  4. vb的用户界面
  5. vb菜单在应用程序中的使用
  6. vb的工具栏、对话框
  7. vb程序设计
  8. vb控件简介
  9. vb的控件数据
  10. vb控件的使用
  11. vb的datagrid控件的使用
  12. 浅析软件项目管理中十个误区
  13. 如何做好软件需求捕获
  14. 软件开发质量管理层次模型
  15. 嵌入式软件测试的十大秘诀
  16. 函数库、组件产品的测试方法
  1. 听说过WinZip软件也可以“杀毒”
  2. Delphi存取图像完整解决方案
  3. 利用Delphi开发旅游景点微机售票
  4. 在DBGrid组件中显示和编辑MEMO字
  5. 学好VC++的十大良好习惯
  6. DELPHI数据库应用程序的开发环境
  7. 汇编DEBUG全过程跟踪
  8. MS Jet SQL for Access 2000中级
  9. MS Jet SQL for Access 2000中级
  10. ACCESS数据库数据传递的方法
  11. 破解Access(*.mdb)目前所有版本的
  12. 汇编中的管道操作方法(一)
  13. 汇编中的管道操作方法(二)
  14. 汇编中的管道操作方法(三)
  15. 汇编进程控制的实现方法(一)
  16. 汇编进程控制的实现方法(二)
  1. VB的程序加密方法
  2. FlexGrid控件的使用
  3. vb的CommonDialog控件的使用
  4. vb的FlexGrid控件
  5. vb的按钮控件
  6. 听说过WinZip软件也可以“杀毒”
  7. 利用Delphi开发旅游景点微机售票
  8. 在DBGrid组件中显示和编辑MEMO字
  9. 学好VC++的十大良好习惯
  10. DELPHI数据库应用程序的开发环境
  11. 汇编DEBUG全过程跟踪
  12. 汇编中的管道操作方法(一)
  13. 汇编中的管道操作方法(二)
  14. 汇编中的管道操作方法(三)
  15. 汇编进程控制的实现方法(一)
  16. 汇编进程控制的实现方法(二)

最近更新

  • 推荐阅读
  • DELPHI《Delphi学堂之用Delphi制作DLL小结》Delphi学堂之用Delphi制作DLL小结
    关于我们 | 版权申明 | 广告服务 | 友情链接 | 网站地图 | 使用帮助 | ©2006-2008 TTADD.COM