运用程序导入函数与动态链接库(DLL)文件中的导出函数进行链接有两种方式:隐式链接和显式链接.隐式链接时,程序员不需要指明DLL文件的路径,也不需要关系DLL文件的加载.显式链接时,则需要在运用程序中提供路径动态加载DLL到内存.
举例: 动态连接库(DLL)文件名: MyTest.dll, 导出头文件: MyTest.h
extern "C" _declspec(dlleort) int MinTest(int x, int y, int z);
extern "C" _declspec(dllexport) int MaxTest(int x, int y, int z);
隐式链接:
1. 声明函数原型,指定动态链接库名和函数名
interface
function MinTest(x, y, z: Integer): Integer; stdcall;
function MaxTest(x, y, z: Integer): Integer; stdcall;
implementation
function MinTest; external 'MyTest.DLL' name 'MinTest';
function MaxTest; external 'MyTest.DLL' name 'MaxTest';
2. 直接调用
Var _vMin : Integer;
begin
_vMin := MinTest(10, 30, 20);
ShowMessage('10, 30, 20 Min: ' + IntToStr(_vMin));
end;
显式调用:
1. 定义函数原型,不需要指定动态链接库名
interface
type
TMinTest = function(x, y, z: Integer): Integer; stdcall;
TMaxTest = function(x, y, z: Integer): Integer; stdcall;
2. 加载动态链接库(DLL),调用需要的函数
var
_vCurPath : string;
_vDllHandle : Integer;
_MinTest : TMinTest;
_vMin : Integer;
begin
_vCurPath := ExtractFilePath(Application.ExeName);
_vDllHandle := LoadLibrary(PChar(_vCurPath + 'MyTest.dll'));
try
if _vDllHandle <> 0 then
begin
_MinTest := GetProcAddress(Handle, 'TestMin');
if @_MinTest <> nil then
begin
_vMin := _MinTest(10, 30, 20);
ShowMessage('10, 30, 20 Min: ' + IntToStr(_vMin));
end;
end;
finally
FreeLibrary(_vDllHandle);
end;
end;
阅读(1050) | 评论(0) | 转发(0) |