gpt4 book ai didi

delphi - 从 BPL 函数返回字符串

转载 作者:行者123 更新时间:2023-12-03 19:05:59 28 4
gpt4 key购买 nike

有一个从 BPL 导出的函数,简化如下

function DoA(amount: currency; var Info: string): Currency; stdcall;
begin
result := amount * 19;
Info:= 'Some Text about the result';
end;

它使用 LoadPackage 和 GetProcAddress 从主程序加载,它适用于其他功能。
但这一个在调用时会带来很多错误;

BPL 与(简化)一起使用
  bplhandle: HModule;
BPLDoA: function (amount: currency; var Info: string): Currency; stdcall;
intoStr : string;

.
 begin
bplhandle:=LoadPackage('test.bpl');
if bplhandle <> 0 then
begin
@BPLDoA:=GetProcAddress(bplhandle,'DoA');
if assigned(BPLDoA) then
result := BPLDoA(123, intoStr);
end;
end;

在程序结束时似乎发生的异常,
但更正后的文本返回到 intoStr (用断点查看)

错误是否与作为 var 和/或字符串的 Info 参数有关?

错误消息是

Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'



谢谢

更多信息>
来自同一个 bpl/unit 的另一个函数工作正常
function DoB(amount: currency): Currency; stdcall;
result := amount * 19;
end;

疯狂除外>

exception class : EInvalidPointer exception message : Invalid pointer operation.

main thread ($1b7c): 0040276f +013 Project1.exe System @FreeMem 00404650 +01c Project1.exe System @LStrClr 00483814 +15c Project1.exe Unit1 97 +11 TForm1.Button3Click 00462430 +064 Project1.exe Controls TControl.Click 0045a870 +01c Project1.exe StdCtrls TButton.Click

最佳答案

您尚未将 EXE 项目配置为“使用运行时包构建”。在项目选项的“包”部分中找到它。 (Documentation)

EInvalidPointer当内存管理器试图释放它没有分配的东西时,就会出现异常。这表明您有两个不同的内存管理器处于事件状态。您的 BPL 正在使用 RTL 包中的一个,它出现在您的包的“需要”列表中。另一方面,您的 EXE 正在使用编译到 EXE 模块中的内存管理器。

通过告诉您的 EXE 使用运行时包来解决此问题,然后确保 RTL 包在所需包的列表中。

关于delphi - 从 BPL 函数返回字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1699195/

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