delphi 怎么动态调用dll中的过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 怎么动态调用dll中的过程相关的知识,希望对你有一定的参考价值。
最好列举一个例子,切记不要函数,只要关于过程的
varForm1: TForm1;
//过程和函数是一样的啊~
//1.为了方便使用,首先要定义一个过程的变量,也就是一个指针啦~像下面这样:
//在var 下面写
abc:procedure;stdcall; //过程就是没有返回值的函数哇
acb:procedure(a:longint);stdcall; //过程就是没有返回值的函数哇
bac:function(a:Longint):longint;stdcall;
implementation
$R *.dfm
procedure TForm1.Button1Click(Sender: TObject);
var
H:cardinal;
A:Longint;
begin
//动态调用的时候,这样子:
//2.首先,用系统API LoadLibrary装入DLL文件,装入后,返回一个句柄吧,当然如果本来就有的话,可以用GetModuleHandle
H:=LoadLibrary('sfc.dll'); //sfc.dll也就是你要装入DLL文件名了
//3.上面取得一个句柄之后,就可以用这个句柄来做事了。 系统API GetProcAddress用来取得DLL上面某个函数的地址(指针啦),
abc:=GetProcAddress(H,'dllproc1'); // dllproc1是DLL内的函数(过程也是一样的),但注意大小写,是敏感的
acb:=GetProcAddress(H,'dllproc2');
bac:=GetProcAddress(H,'dllproc3');
//4.现在就可以像普通调用函数(过程)使用它了
abc;
acb(12);
A:=bac(12);
Form1.Caption:=inttostr(A);
end; 参考技术A 实际上,DLL和DELPHI的单元文件差不多,不同的是一个单元文件,主单元可以调用其中的任意一个方法(函数和过程),但对DLL确只能从它的入口(函数或过程)进入该DLL.单元文件可以操作主单元界面上的控件,但DLL肯定不能这样做.一个DLL可以有多个入口,入口可以是函数也可以是过程,你要调用它的过程,你就把该过程指定为入口就行了.不知对不对.本回答被提问者和网友采纳 参考技术B dll需要给出接口函数的,没有接口函数怎么调用?
Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)
Delphi 中的DLL 封装和调用对象技术
本文刊登2003 年10 月份出版的Dr.Dobb\'s 软件研发第3 期
刘 艺
摘 要
DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对象受到对
象动态绑定机制的限制使得DLL 在封装对象方面有一定的技术难度导致有些Delphi 程
序员误以为DLL 只支持封装函数不支持封装对象本文着重介绍了DLL 中封装和调用对
象的原理和思路并结合实例给出了多种不同的实现方法
关键字动态链接库DLL 对象接口虚方法动态绑定类引用面向对象
1 物理封装与动态链接
物理上的封装意味着将程序封装成若干个独立的物理组成部分各部分之间通过动态链
接共同完成系统的功能而且各个物理组成部分可以单独维护和编译不影响其他部分要
理解物理封装首先要搞清楚静态链接和动态链接
在Delphi 中如果程序的各个模块分别保存在不同的单元文件中并通过uses 指令来
互相调用这就是一个典型的静态链接于是各个静态的子例程编译之后连接器从Delphi
编译过的单元或静态库中取出子例程编译代码并添加到执行文件中最终EXE 文件包
括了程序及其所属单元的所有代码显然静态链接的单元或模块最终以一个独立的物理形
式可执行文件存在除了自己编写的单元文件Delphi 还自动uses 了一些预设的单元
如Windows Messages 等这些都是静态链接
静态链接无法实现物理上的切割和封装而且一旦其中某个单元或模块改动其他所有
单元或模块都得随之重新编译和连接
用于实现物理切割和封装的bpl 包DLL 动态链接库或COM+组件都是一种动态链接
的形式在动态链接情况中连接器只使用子例程external 声明中的信息在执行文件中产生
一些数据表格当Windows 向内存中装载执行文件时它首先装载所有必需的DLL 然后
程序才会启动在装载过程中Windows 用函数在内存中的地址填充程序的内部表格
每当程序调用一个外部函数时它就会使用该内部数据表格直接对DLL 代码它当前
装载在程序的地址空间中进行调用注意该模式不会涉及两个不同的应用程序DLL
已经变成了应用程序的一部分并装载在同一地址空间所有参数的传递都发生在堆栈上
与其它任何函数调用一样这里我们不打算讨论DLL 的编译因为我们首先想重点介绍
Delphi 中的DLL 封装和调用对象技术
2 用DLL 封装对象
DLL Dynamic Link Library 动态链接库就目前来讲已经不再是什么新技术读者可
以在书店过时的Delphi 书籍里随便找到讨论DLL 编程的章节但这些涉及DLL 编程的书
中几乎都是谈论用DLL 来封装函数的实际上大量的程序员也是在使用DLL 来封装函数
或面向过程的一个模块一个函数集合而在这里我只想讨论如何用DLL 来封装对象
这可能是读者未曾有过的DLL 使用经验但这却是这本完全围绕面向对象编程的书中重要
的部分之一或许你能从中发现一些与众不同的实用技巧
参见考虑到目前关于DLL的现成资料很多这里我省略了DLL的基本知识和编写
方法假设读者已经有了一定的DLL编程基础如果你没有这样的基础建议参阅
拙作Delphi6企业级解决方案及应用剖析DLL编程技术一节P271
一般来说使用DLL 封装对象主要有以下好处
以上是关于delphi 怎么动态调用dll中的过程的主要内容,如果未能解决你的问题,请参考以下文章