免费帕斯卡找不到dll的入口点



我对pascal完全陌生。我想在免费的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在一个目录中。

请帮帮我!

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

(此外,GetProcAddress非常特定于Windows,WinAPI中的大多数函数都是stdcall,而不是cdecl。除非您有文档表明这些函数使用cdecl调用约定,否则您可能应该使用stdcall。)

您还需要在use子句中至少使用Windows单元,因为这是声明GetProcAddressLoadLibrary的地方。

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

最新更新