三 DLL库的访问
访问DLL库有两种方式一种是静态引用另一种是动态引用
用静态引用这种方法装入DLL要做两件事情为DLL 库创建一个输入单元以及
用USES把输入单元连接到要使用DLL 函数的程序模块中为DLL库创建的输入单元与普通的单元的区别仅在于在它的接口处声明的过程函数并不在它的实现部分给出真正的实现代码而是用external关键字把过程函数的实现细节委托给外部DLL模块
external命令的使用语法如下
procedure /function 过程/函数名;external DLL模块名;
下面给出为上面创建的minmaxDLL库写的输入单元源文件testdll pas从中可看出输入单元 与一般 单元的一些差别代码如下所示
以下是引用片段
unittestdll;
interface
uses
functionMin(XY:Integer):Integer;
functionMax(XY:Integer):Integer;
implementation
functionMin;externalminmaxDLL;
functionMax;externalminmaxDLL;
end
一个应用程序若想调用minmaxDLL中的函数只须在其uses语句中加入testdll 单元即可
动态装入DLL要用到Windows的三个API函数LoadlibraryFreelibrary和GetprocAddress loadlibrary函数用来装入DLL库其调用格式如下
function loadlobrary (DLLfileNamePchar): THandle:
当不再需要一个DLL库时应调用FreeLibrary函数将其释放以空出宝贵的内存资源其调用格式如下
procedure FreeLibrary (Libmodule:THandle)
Libmodule 为由LoadLibrary调用得到的DLL库句柄在用loadlobrary 函数装入某个DLL库和调用FreeLibrary释放该DLL库之间的程序段中 可以使用该DLL库中的过程和函数具体使用方法是用GetprocAddress函数把DLL库中函数的地址传递给程序中某个函数变量再用该变量实现DLL函数的调用GetprocAddress函数声名如下
以下是引用片段
function GetprocAddress (Libmodule:THandle:procname:pchar):TFarProc:
如下例所示
type
TTimeRec=record
Second:Integer;
Minute:Integer;
Hour:Integer;
end;
TGetTime=procedure(varTime:TTimeRec);
THandle=Integer;
var
Time:TTimeRec;
Handle:THandle;
GetTime:TGetTime;
begin
Handle:=LoadLibrary(DATETIMEDLL);
ifHandle<>then
begin
@GetTime:=GetProcAddress(HandleGetTime);
if@GetTime<>nilthen
begin
GetTime(Time);
withTimedo
WriteLn(ThetimeisHour:Minute:Second);
end;
FreeLibrary(Handle);
end;
end;
在调用动态链接库时应注意 所需动态链接库须与应用程序在同一目录或Windows System 目录下
动态链接库是 Windows下程序组织的一种重要方式使用动态链接库可以极大地保护用户在不同开发工具不同时期所做的工作提高编程效率
[] []