从BPL函数返回一个字符串

时间:2009-11-09 05:09:58

标签: delphi delphi-7 bpl

有一个从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

3 个答案:

答案 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