有一个从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(以断点查看)
错误与Info param是var和/或字符串有什么关系吗?
错误讯息是
Project Project1.exe引发了异常类EInvalidPointer,并显示消息“无效指针操作”
感谢
更多信息&gt; 来自同一个bpl / unit的另一个函数可以正常工作
function DoB(amount: currency): Currency; stdcall;
result := amount * 19;
end;
Mad Except&gt;
异常类:EInvalidPointer 异常消息:指针操作无效。
主线程($ 1b7c): 0040276f +013 Project1.exe系统@FreeMem 00404650 + 01c Project1.exe系统@LStrClr 00483814 + 15c Project1.exe Unit1 97 +11 TForm1.Button3Click 00462430 +064 Project1.exe控件TControl.Click 0045a870 + 01c Project1.exe StdCtrls TButton.Click
答案 0 :(得分:6)
您尚未将EXE项目配置为“使用运行时包构建”。在项目选项的“包”部分中找到它。 (Documentation)
当内存管理器尝试释放它未分配的内容时,会出现EInvalidPointer异常。这表明你有两个不同的内存管理器活跃。您的BPL正在使用RTL包中的一个,该包显示在包的“需求”列表中。另一方面,您的EXE正在使用编译到EXE模块中的内存管理器。
修复此问题,告诉您的EXE使用运行时包,然后确保RTL包在所需包的列表中。
答案 1 :(得分:1)
您的导入声明是否与导出的函数的签名完全匹配?
必须是这样的:
DoAProc: function (amount: currency; var Info: string): Currency; stdcall;
答案 2 :(得分:0)
如果您不希望被要求发送额外的BPL(现在您的主要exe将使用运行时BPL),则另一个选项是在项目中包含ShareMem单元。查看Delphi帮助文件中的“共享内存”主题。
MS-帮助://embarcadero.rs2010/rad/Sharing_Memory.html