gpt4 book ai didi

delphi - 如何动态加载和调用 BPL 包中的函数

转载 作者:行者123 更新时间:2023-12-03 18:52:33 26 4
gpt4 key购买 nike

看起来很简单,但下面的代码不起作用。

BPL:

procedure DoSomething();
begin
LogEvent('Did');
end;

exports
DoSomething;

主要EXE:
procedure CallModuleFunc;
var
H: THandle;
P: procedure();
begin
H := LoadPackage('mymod.bpl');
try
if (H <> 0) then
begin
@P := GetProcAddress(H, 'DoSomething');
if Assigned(P) then
P();
end;
finally
UnloadPackage(H);
end;
end;

现在没有错误,bpl 成功加载 LoadPackage()但是 GetProcAddress()返回零。为什么?可能是因为名称困惑。我试过添加 stdcall (导出函数和 P 的声明)但这并没有解决问题。我已经在网上看到了数百个应该以这种方式工作的示例。我什至试过 GetProcAddress(H, 'DoSomething$qqsv')但它也没有用。我在这里想念什么?

最佳答案

经过数小时的搜索和反复试验,我意识到这必须与我做的或做的不同的事情有关。问题是我的第一个版本 mymod.bpl 被放入了 Delphi 的默认 BPL 输出目录(没有导出,根本没有 DoSomething())。然后,我将 BPL 输出目录更改为我项目的根源目录,这样我就可以在一个地方看到源代码和 bpl 模块。 exe 没有像以前在 Delphi 7 中那样放入源所在的位置,它位于 Debug 或 Release 文件夹下。误导我的是,当 LoadPackage() 在 exe 的当前目录(调试/发布)中找不到模块时,它会查看 Delphi 的默认包文件夹(其中包含 bpl 的第一个和错误版本)并加载它,所以没有那里出错,但也没有 DoSomething() 因为它不再由我的模块编译更新。

我希望这个解释可以帮助其他可能有类似问题的人解决问题。感谢所有抽出时间阅读本文并撰写评论的人。

关于delphi - 如何动态加载和调用 BPL 包中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39430980/

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