Delphi中动态链接库(DLL)的建立和使用
动态链接库是应用程序和其他dll可以调用的进程和函数的集合,它包含公共代码或资源。因为DLL代码使用了内存共享技术,而且windows在某些地方赋予DLL一些更高的权限,所以DLL可以实现一些普通程序无法实现的功能,比如Windows的HOOK和ISAPI。同时,DLL为不同语言之间的代码共享提供了一种便捷的方式。因此,DLL在编程中被广泛使用。本文将介绍如何在Delphi中建立和使用DLL。
1.。DLL库内存共享机制
从使用效果来看,DLL和unit很像。它们都可以被其他工程模块调用,但它们的内部实现机制有所不同。如果某个单元在一个程序模块中被一个uses语句引用,编译器会将该模块和该单元一起编译,并将编译后的可执行代码链接到该程序模块,这就是为什么一个程序模块可以调用被引用单元中的过程和函数。当同一个单元被多个项目引用时,每个项目都包含该单元的可执行代码。当包含该单元的多个项目同时执行时,该单元的可执行代码会随着不同的项目多次调入内存,造成内存资源的浪费。
DLL不一样。即使被某个项目调用,编译后仍然是独立的。也就是说,一个DLL库经过编译后,形成一个单独的可执行文件,不与其他任何可执行文件相连。因此,DLL库不从属于特定的项目。当多个项目调用同一个DLL库时,只有第一个项目将DLL库调用到内存中,其他项目并不是重复地将同一个DLL库调用到内存中,而是从同一个共享内存区域读取。另外,DLL的执行代码是在程序运行过程中动态调入的,而不是在程序运行时像单元一样和整个项目一起调入内存。这样就可以消除unit带来的同一个代码在很多地方占用内存的弊端。
Delphi 2中动态链接库的建立
在Delphi环境下,写一个DLL和写一个一般的应用程序没有太大的区别。实际上,DLL函数的编程作为DLL的主体,除了内存和资源管理上的差异之外,并不需要其他特殊的手段。
一般工程文件的格式为:
节目标题;
使用条款;
程序体
dll项目文件的格式是:
图书馆的项目名称;
使用条款;
Exprots条款;
程序体
它们之间有两个主要区别:
1.program关键字用于一般工程文件的文件头,而library关键字用于DLL工程文件的文件头。不同的关键字告诉编译器生成不同的可执行文件。program关键字生成一个。而library关键字生成一个. dll文件。
2.如果DLL希望为其他应用程序输出函数或过程,这些函数或过程必须在exports子句中列出。这些函数或过程本身必须使用导出编译指令进行编译。
选择新的...项,双击弹出窗口中的DLL图标,就会自动给出DLL源模块框架,如下图:
图书馆项目1;
{...评论...}
使用
SysUtils,类;
开始
结束。
接下来,可以在USES和begin之间添加要在DLL中实现的过程和函数的定义,并使用export和exprots的单词将它们引出,以便其他模块可以引用它们。在begin和end之间添加初始化代码,用于初始化DLL变量。需要注意的是,即使没有初始化代码begin和end,也不能省略,如下例所示:
库minmax
函数Min(X,Y: Integer):整数;出口;
开始
如果X < Y那么Min := X否则Min:= Y;
结束;
函数Max(X,Y: Integer):整数;出口;
开始
如果X > Y那么Max := X否则Max:= Y;
结束;
出口
最小索引1,
最大指数2;
开始
结束。
在minmax.DLL编译并保存后,形成一个DLL库文件。
0条评论