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

上传人:ji****72 文档编号:37699915 上传时间:2018-04-21 格式:DOC 页数:12 大小:42KB
返回 下载 相关 举报
如何用delphi制作DLL动态库方法_第1页
第1页 / 共12页
如何用delphi制作DLL动态库方法_第2页
第2页 / 共12页
如何用delphi制作DLL动态库方法_第3页
第3页 / 共12页
如何用delphi制作DLL动态库方法_第4页
第4页 / 共12页
如何用delphi制作DLL动态库方法_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《如何用delphi制作DLL动态库方法》由会员分享,可在线阅读,更多相关《如何用delphi制作DLL动态库方法(12页珍藏版)》请在金锄头文库上搜索。

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

2、参数类型一致。不要用 DELPHI 的数据类型。 2 最好有返回值即使是一个过程,来报出调用成功或失败,或状态。成功或失败的返回 值最好为 1成功或 0失败.一句话,与 windows c+兼容。 3 用 stdcall 声明后缀。 4 最好大小写敏感。 5 无须用 far 调用后缀,那只是为了与 windows 16 位程序兼容。 三 DLL 的初始化和退出清理如果需要初始化和退出清理 1 DLLProcSysUtils 单元的一个 Pointer是 DLL 的入口。在此你可用你的函数替换了它的入 口。但你的函数必须符合以下要求其实就是一个回调函数。如下: procedure DllEnte

3、rPoint(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

4、在退出时一定保证 DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。四 全局变量的使用 在 widnows 32 位程序中,两个应用程序的地址空间是相互没有联系的。虽然 DLL 在内存中是一份,但变量是在各进程的地址空间中,因此你不能借助 dll 的全局变量来达到两个 应用程序间的数据传递,除非你用内存映像文件。 五 调用静态载入 1 客户端函数声名: 1)大小写敏感。 2)与 DLL 中的声明一样。 如: showform(form:Tform);Far;externalyproject_dll.dll; 3)调用时传过去的参数类型最好也与

5、windows c+一样。 4)调用时 DLL 必须在 windows 搜索路径中,顺序是:当前目录;Path 路径; windows;widowssystem;windowsssystem32; 六 调用动态载入 1 建立一种过程类型如果你对过程类型的变量只是一个指针的本质清楚的话,你就知道是 怎么回事了。如: type mypointer=procedure(form:Tform);Far;external; var Hinst:Thandle; showform:mypointer; begin Hinst:=loadlibrary(yproject_dll);/Load 一个 Dll,

6、按文件名找。 showform:=getprocaddress(Hinst,showform);/按函数名找,大小写敏感。如果你知道自动化 对象的本质就清楚了。 showform(application.mainform);/找到函数入口指针就调用。 Freelibrary(Hinst); end; 七 在 DLL 建立一个 TForM 1 把你的 Form Uses 到 Dll 中,你的 Form 用到的关联的单元也要 Uses 进来这是最麻烦的 一点,因为你的 Form 或许 Uses 了许多特殊的单元或函数 2 传递一个 Application 参数,用它建立 Form. 八 在 DLL

7、 中建立一个 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 的 MainF

8、orm。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

9、; $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 ccc := Text; end; procedure ShowCCC;stdcall; begin Sh

10、owMessage(String(ccc); end; exports OpenForm; InputCCC, ShowCCC; begin end. 调用方源代码: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; procedure Button1Click(Sende

11、r: TObject); procedure Button2Click(Sender: TObject); private Private declarations public Public declarations end; var Form1: TForm1; implementation $R *.DFM procedure OpenForm(mainForm:TForm);stdcall;Externalproject2.dll; procedure ShowCCC;stdcall;Externalproject2.dll; procedure InputCCC(Text: Pcha

12、r);stdcall;Externalproject2.dll; procedure TForm1.Button1Click(Sender: TObject); var Text: Pchar; begin Text := Pchar(Edit1.Text); / OpenForm(Application.MainForm);/为了调 MDICHILD InputCCC(Text);/为了实验 DLL 中的全局变量是否在各个应用程序间共享 end; procedure TForm1.Button2Click(Sender: TObject); begin ShowCCC;/这里表明 WINDO

13、WS 32 位应用程序 DLL 中的全局变量也是在应用程序地址空 间中,16 位应用程序或许不同,没有做实验。 end; 十 Delphi 制作的 Dll 与其他语言的混合编程中常遇问题: 1 与 PowerBuilder 混合编程 在定义不定长动态数组方面在函数退出清理堆栈时老出现不可重现的地址错,原因未明, 大概与 PB 的编译器原理有关,即使 PB 编译成二进制代码也如此。Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs) 。一般程序运行是用.EXE 文件,但应用程序有时也可以 调用存储在 DLL 中的函数。当我们调用 Windows 中的 API 函数的时候,实

14、际上就是调用 存储在 DLL 中的函数。在如下几种情况下,调用 DLL 是合理的:1) 不同的程序使用相同的 DLL ,这样只需要将 DLL 在内存 中装载一次,节省了内存的开销。2) 当某些内容需要升级的时候,如果使用 DLL 只需要改变 DLL 就可以了,而不需要把整个程序都进行变动。3) 由于 DLL 是独立于语言的,所以,当不同语言习惯的人 共同开发一个大型项目的时候,使用 DLL 便于程序系统的交流, 当然,Delphi 开发的 DLL 也可以在诸如 Visual BASIC,C+ 等系 统中使用。下面通过几个例子,说明 Delphi 开发动态连接库的方法和规 范。 第一节 动态连接

15、库的构建和调用方法 一、动态连接库构建 File-New-Other-DLL Wizard 这就创建了一个动态连接库的基本模块 library Project2; usesSysUtils,Classes; $R *.res begin end. 把工程名改为 Mydll,并写入必要的函数 library mydll; usesSysUtils,Classes,Dialogs,windows; function Triple(N:Integer):integer;stdcall;beginresult:=N+3;end; function Double(N:Integer):integer;stdcall;beginresult:=N+2;end; function Triple1(N:Integer):integer;stdcall;beginshowmessage(计算 N+3);result:=N+3;end; function Double1(N:Integer):integer;stdcall;beginmessagebox(0,计算 N+2,计算 N+2,mb_ok);result:=N+2;end; exportsTriple name Tr,Double name Do,Triple1 name TrM,Double1 name DoM

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号