我有一个 C# 应用程序,它使用以下代码调用本机 Delphi dll:
C#
[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern int GetString(string out str);
德尔福
function GetString(out a: PChar): Integer; stdcall;
begin
a := PChar('abc');
Result := 1;
end;
这在 32 位应用程序中运行良好。但是当我为 64 位编译 C# exe 和 Delphi dll 时,我遇到了一个奇怪的问题。在 Delphi 调试器中调用 GetString 后,我可以看到在 .NET 代码中的某处引发了异常,并且以下字符串出现在“调试器输出”窗口中:“检测到严重错误 c0000374”。谷歌表示此错误与堆损坏有关。我尝试使用 ref/var 参数修饰符而不是 out/out。仍然没有运气。为什么我会收到此错误?我应该为 64 位使用不同的调用约定吗?
顺便提一句。以下组合工作正常:
C#
[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern string GetString(string a);
德尔福
function GetString(a: PChar): PChar; stdcall;
var
inp: string;
begin
inp := a;
Result := PChar('test ' + inp);
end;
工作正常。但我确实需要返回一个字符串作为输出参数。