作者:222.243.218.* 2005-12-6 10:17 回复 此发
言
2 Delphi 中动态链接库(DLL)的建立和使用
external 命令的使用语法如下: procedure /function 过程/函数名;external DLL 模块名; 下面给出为上面创建的 minmax.DLL 库写的输入单元源文件 testdll .pas,从中可看出输入单元与一般单元的一些差别,代码如下所示: unit testdll; interface uses function Min (X, Y: Integer): Integer; function Max (X, Y: Integer): Integer; implementation function Min; external ‘minmax.DLL’; function Max; external ‘minmax.DLL’; end. 一个应用程序若想调用 minmax.DLL 中的函数,只须在其 uses 语句中 加入 testdll 单元即可。 动态装入 DLL,要用到 Windows 的三个 API 函数。Loadlibrary、 Freelibrary 和 GetprocAddress 。 loadlibrary 函数用来装入 DLL 库,其调 用格式如下: function loadlobrary (DLLfileName:Pchar): 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(var Time: TTimeRec); THandl
e = Integer; var Time: TTimeRec; Handle: THandle; GetTime: TGetTime; ... begin Handle := LoadLibrary('DATETIME.DLL'); if Handle <> 0 then begin @GetTime := GetProcAddress(Handle, 'GetTime'); if @GetTime <> nil then begin GetTime(Time); with Time do WriteLn('The time is ', Hour, ':', Minute, ':', Second); end; FreeLibrary(Handle); end; end;
在调用动态链接库时应注意, 所需动态链接库须与应用程序在同一目 录或 Windows System 目录下。 动态链接库是 Windows 下程序组织的一种重要方式,使用动态链接库 可以极大地保护用户在不同开发工具、不同时期所做的
工作,提高编程 效率。