免费Pascal无法找到dll的入口点

时间:2012-02-22 18:44:26

标签: delphi dll pascal freepascal

我是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在一个目录中。

请帮助我!

1 个答案:

答案 0 :(得分:7)

GetProcAddress不是你认为的那样;它的目的是在DLL中找到命名过程或函数并返回该函数的地址,以便可以从代码中调用它。您必须首先使用LoadLibrary将动态链接库(DLL)加载到内存中,然后将句柄传递给该DLL作为GetProcAddress的第一个参数以及您想要的地址的函数名称作为第二个参数。如果可以在DLL中找到该函数,则返回它的地址,并且可以使用该地址来调用该函数。

(此外,GetProcAddress非常适合Windows,WinAPI中的大部分功能都是stdcall而不是cdecl。除非您有文档说明功能正在使用cdecl调用约定,您应该使用stdcall。)

您的使用条款中至少还需要Windows单位,因为这是宣告GetProcAddressLoadLibrary的地方。

有关详细信息,请参阅LoadLibraryGetProcAddress上的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中通常不能有多个具有相同名称的函数,因为没有可用于确定在加载完成时加载哪个函数的信息。每个都应该有一个单独的,不同的名称,否则加载可能会失败。