delphi 调用dll运行正常,退出时弹出错误解决办法


本文整理自网络,侵删。

 

分析原因:Dll中函数返回值最好不要使用string类型,而采用PChar类型。因为string类型是系统自动分配内存空间,而PChar则是用户根据需求而进行分配的。

解决办法:得出结论了:ShareMem 应加在Dll和主程序的project文件中,而且必须紧接在uses后的第一个位置引用,这是最关键的。

 

例如主程序:

program Project1;

 

uses

  ShareMem, //关键位置 必须紧接在uses后的第一个位置引用

  Vcl.Forms,

  Unit1 in 'Unit1.pas' {Form1},

  Vcl.Themes,

  Vcl.Styles;

 

{$R *.res}

 

begin

  Application.Initialize;

  Application.MainFormOnTaskbar := True;

  Application.Title := '';

  TStyleManager.TrySetStyle('Luna');

  Application.CreateForm(TForm1, Form1);

  Application.CreateForm(TForm20, Form20);

  Application.Run;

end.

 

dll文件:

library Key;

uses

  ShareMem, //关键地方

  System.SysUtils,

  System.Classes;

 

{$R *.res}

 

function GetExeMD5_1:STRING;stdcall;

begin

  Result :='';

end;

 

function GetExeMD5_2:STRING;stdcall;

begin

 Result :='';

end;

 

exports

    GetExeMD5_1,GetExeMD5_2;

begin

end.

 

实际我们用IDE创建DLL文件已经有英文提示,只是没有在意。

百度翻译:

关于DLL内存管理的重要说明:ShareMem必须是

库的USES子句和项目的第一个单元(选择

如果DLL导出任何过程或

将字符串作为参数或函数结果传递的函数。这个

应用于所有传递到或从DLL传递的字符串--甚至那些

嵌套在记录和类中。ShareMem是

BORLNDMM.DLL共享内存管理器,它必须与

用你的DLL。要避免使用BORLNDMM.DLL,请传递字符串信息

使用PChar或ShortString参数。

相关阅读 >>

Delphi 内存管理1

Delphi b编码以及bt种子文件分析

Delphi函数assignfile使用

Delphi中查找进程及强行结束进程的方法

Delphi incyear、incmonth、incweek、incday、inchour、incminute、incsecond、incmillisecond �c 增时

Delphi写的dll回调c#

Delphi获取uri的查询参数

Delphi 小数点四舍五入问题

Delphi twebbrowser 用法

Delphi 网络时间校对

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...