从BPL函数返回一个字符串

Chr*_*ase 1 delphi bpl delphi-7

有一个功能,简化如下,从BPL导出

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

它使用LoadPackage从主程序加载,GetProcAddress可以很好地用于其他功能.但是当它被调用时会出现许多错误;

BPL与(简化)一起使用

  bplhandle: HModule;
  BPLDoA: function (amount: currency; var Info: string): Currency; stdcall;
  intoStr : string;
Run Code Online (Sandbox Code Playgroud)

.

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

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

错误与Info param是var和/或字符串有什么关系吗?

错误消息是

项目Project1.exe引发了异常类EInvalidPointer,并显示消息"无效的指针操作"

谢谢

更多信息>来自同一个bpl/unit的另一个函数工作正常

function DoB(amount: currency): Currency; stdcall;
  result := amount * 19;
 end;
Run Code Online (Sandbox Code Playgroud)

疯狂除外>

exception class: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

Rob*_*edy 6

您尚未将EXE项目配置为"使用运行时包构建".在项目选项的"包"部分中找到它.(文件)

EInvalidPointer当内存管理器试图释放的东西,它没有分配异常来.这表明你有两个不同的内存管理器是活动的.您的BPL正在使用RTL包中的一个,该包显示在包的"需求"列表中.另一方面,您的EXE正在使用编译到EXE模块中的内存管理器.

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