【问题标题】:Free Pascal can't find entry point for dllFree Pascal 找不到 dll 的入口点
【发布时间】:2012-03-13 03:31:07
【问题描述】:

我对帕斯卡完全陌生。 我想在 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在一个目录下。

请帮助我!

【问题讨论】:

  • 显而易见的第一个问题:您的 DLL 中是否有 supposed 有一个名为 GetProcAddress 的函数?

标签: delphi dll pascal freepascal


【解决方案1】:

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

(此外,GetProcAddress 是相当特定于 Windows 的,WinAPI 中的大多数函数是 stdcall 而不是 cdecl。除非您有文档说明这些函数使用 cdecl 调用约定,你应该使用stdcall。)

您还需要在您的 uses 子句中至少使用 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 中拥有多个同名的函数,因为在加载完成时没有可用于确定要加载哪个函数的信息。每个都应该有一个单独的、不同的名称,否则加载可能会失败。

【讨论】:

  • +1 我不明白你为什么得到 -1,这已经很好地解释了,但我会将“myddlprocs”单元代码与“程序”代码分开,否则会变得更难理解,但除此之外,它是完美的!
  • +1 不知道为什么有人会对此投反对票。我唯一的问题是第二段暗示人们可能会猜测调用约定。应该始终确定调用约定是什么。还有一个小问题,你所说的静态链接正式称为隐式链接,但我敢肯定每个人都厌倦了我指出这一点。
  • 谢谢。 Dorin,我确实将两者分成单独的单元(unit MyDllProcsprogram Test)。大卫,我接受挑剔,但我认为这两个术语都是可以接受的(Delphi 文档中提到 staticdynamic 链接到 DLL;我不知道它们现在是否是这样写的,但是对于那些'已经用过 D/C++Builder 的术语会很熟悉)。我也不知道投反对票,但我有怀疑(通常的怀疑)。
  • 在 FPC 中习惯使用单位 dynlibs 来加载库和获取符号。它比 Windows 更便携。
  • @Marco,谢谢。我不使用 FPC,所以我没有那个信息。问题是关于使用 GetProcAddress (无论如何,根据代码),所以这就是我的回答。不过,我会归档 dynlibs 以供将来参考。
猜你喜欢
  • 2012-12-08
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2014-08-08
相关资源
最近更新 更多