gpt4 book ai didi

delphi - Free Pascal 找不到 dll 的入口点

转载 作者:行者123 更新时间:2023-12-03 18:16:46 24 4
gpt4 key购买 nike

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

请帮助我!

最佳答案

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

(此外,GetProcAddress 非常特定于 Windows,并且 WinAPI 中的大多数函数都是 stdcall 而不是 cdecl。除非你有文档说函数正在使用 cdecl 调用约定,你可能应该使用 stdcall。)

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

请参阅 LoadLibrary 上的 WinAPI 文档和 GetProcAddress获取更多信息。

对于初级程序员,您可能会发现使用函数的静态链接比使用动态链接(通过 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 中使用同名的多个函数,因为没有可用的信息来确定加载完成时要加载的函数。每个都应该有一个单独的、不同的名称,否则加载可能会失败。

关于delphi - Free Pascal 找不到 dll 的入口点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9400992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com