本文整理自网络,侵删。
分析原因: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 如何在webservice中获取客户端的ip地址
Delphi实现获取文件及文件夹大小(支持超过2g的大文件)
Delphi twebbrowser出现 method pastehtml not supported by automation object 解决方法
更多相关阅读请进入《Delphi》频道 >>