我是pascal的新手。 我想在free pascal中调用我的函数在.dll文件中,当我运行项目时出现以下错误:
无法在动态链接库HNLib.dll中找到过程入口点GetProcAddress。
这是代码:
Program Test;
function GetProcAddress : Integer; cdecl; external 'HNLib.dll';
function GetProcAddress : Single; cdecl; external 'HNLib.dll';
procedure GetProcAddress( X : Single); cdecl; external 'HNLib.dll';
procedure GetProcAddress; cdecl; external 'HNLib.dll';
begin
GetProcAddress( 5.5 );
readln;
end.
.pas文件和dll在一个目录中。
请帮助我!
答案 0 :(得分:7)
GetProcAddress
不是你认为的那样;它的目的是在DLL中找到命名过程或函数并返回该函数的地址,以便可以从代码中调用它。您必须首先使用LoadLibrary
将动态链接库(DLL)加载到内存中,然后将句柄传递给该DLL作为GetProcAddress
的第一个参数以及您想要的地址的函数名称作为第二个参数。如果可以在DLL中找到该函数,则返回它的地址,并且可以使用该地址来调用该函数。
(此外,GetProcAddress
非常适合Windows,WinAPI中的大部分功能都是stdcall
而不是cdecl
。除非您有文档说明功能正在使用cdecl
调用约定,您应该使用stdcall
。)
您的使用条款中至少还需要Windows
单位,因为这是宣告GetProcAddress
和LoadLibrary
的地方。
有关详细信息,请参阅LoadLibrary和GetProcAddress上的WinAPI文档。
对于初级程序员,您可能会发现使用函数的静态链接而不是动态(使用GetProcAddress
得到的)更容易。静态链接的一个例子是(未经测试!!! - 只是一个快速的代码示例,因为我没有'HNLib.DLL'来链接):
// Your Dll import unit
unit MyDllProcs;
interface
function GetIntCalcResult(const IntVal: Integer);
implementation
function GetIntCalcResult(const IntVal: Integer); stdcall; external 'HNLib.dll';
end.
// Your own app's code
program Test;
interface
uses MyDllProcs;
implementation
function DoSomethingWithDll(const ValueToCalc: Integer): Integer;
begin
Result := GetIntCalcResult(ValueToCalc);
end;
begin
WriteLn('DoSomethingWithDll returned ', DoSomethingWithDll(10));
ReadLn;
end.
请注意,当静态链接这样的DLL函数时,您的DLL必须在应用程序启动时可用,并且该函数必须包含在该DLL中;如果没有,您的应用程序将无法加载。
另外,请注意,DLL中通常不能有多个具有相同名称的函数,因为没有可用于确定在加载完成时加载哪个函数的信息。每个都应该有一个单独的,不同的名称,否则加载可能会失败。