【问题标题】:Returning a string from a BPL function从 BPL 函数返回字符串
【发布时间】:2010-12-14 12:38:22
【问题描述】:

有一个从 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 参数是 var 和/或字符串有关?

错误信息是

Project Project1.exe 引发异常类 EInvalidPointer 并带有消息“无效指针操作”

谢谢

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

function DoB(amount: currency): Currency; stdcall;
  result := amount * 19;
 end;

疯狂的除外>

异常类: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

【问题讨论】:

  • 您的金额上没有“var”
  • 对不起这个例子不是最好的改变它

标签: delphi delphi-7 bpl


【解决方案1】:

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

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

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

【讨论】:

  • 太棒了,我感觉这会是一件简单的事情,谢谢
【解决方案2】:

您的导入声明是否与导出函数的签名完全匹配?

必须是这样的:

DoAProc: function (amount: currency; var Info: string): Currency; stdcall;

【讨论】:

  • 似乎stdcall;缺少指令。
  • 啊没看到,我加了,好像没什么变化
  • 奇怪。好的,这是一个疯狂的镜头 - 两个项目是否使用相同的 Delphi 版本和相同的内存管理器编译?
  • 相同的delphi,(项目组中的poth,使用build all构建)。不确定内存管理器,我没有改变它。我应该尝试类似 fastmm4 的东西吗...
  • 不确定 fastmm 是否会添加调试器无法提供的额外帮助。
【解决方案3】:

如果您不想被要求提供额外的 BPL(现在您的主 exe 正在使用运行时 BPL),另一个选择是在您的项目中包含 ShareMem 单元。查看 Delphi 帮助文件中的“共享内存”主题。

ms-help://embarcadero.rs2010/rad/Sharing_Memory.html

【讨论】:

猜你喜欢
  • 2014-12-07
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多