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 vclskin 5.40在2010安装方法

Delphi 如何在webservice中获取客户端的ip地址

Delphi安卓动态切换本地主题

Delphi restfull api调用方法

Delphi 抓屏技巧二三例

Delphi实现获取文件及文件夹大小(支持超过2g的大文件)

Delphi dll初始化和退出处理

Delphi 实现文件防删除非亢占(非hook)

Delphi twebbrowser出现 method pastehtml not supported by automation object 解决方法

Delphi 用wininet 单元实现 post提交数据

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



打赏

取消

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

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

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

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

评论

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