16,748
社区成员
发帖
与我相关
我的任务
分享
uses
System.SysUtils,
System.Classes;
{$R *.res}
function GetData: PAnsiChar; stdcall;
var
data: string;
begin
data := 'abc';
result :=PAnsiChar(AnsiString(data));
end;
exports
GetData;
begin
// DLLProc := @DLLEntryPoint;
// DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
用C# 调用
[DllImport("Project1.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
static extern public string GetData();
static void Main(string[] args)
{
string data = GetData();
Console.WriteLine(data.ToString());
Console.Read();
}
发现获得result后,返回时,发生了DLL 输出了异常,
critical error detected ,网上说是什么堆被破坏
而C#端直接闪退,没有任何错误提示
怎么处理
int GetData(var data:PAnsiChar);
var
str:string;
begin
str:='abc';
StringToPAnsiChar(str,data);
result:=0;
end;
并且通过move
class procedure TFunctions.StringToPAnsiChar(str:string;var dest:PAnsiChar);
var
ansiStr:AnsiString;
begin
ansiStr:=AnsiString(str);
Move(ansiStr[1], dest^, Length(ansiStr)+1);
end;
并且在C#端参数定义为StringBuilder data,由C#来管理内存