次のコードを使用してネイティブ Delphi dll を呼び出す C# アプリケーションがあります。
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 ビット アプリケーションで正常に動作します。しかし、C# exe と Delphi dll の両方を 64 ビット用にコンパイルすると、奇妙な問題が発生します。Delphi デバッガーで GetString を呼び出した後、.NET コードのどこかで例外が発生し、デバッガーの出力ウィンドウに次の文字列が表示されることがわかります: "Critical error detected c0000374" . Google は、このエラーはヒープの破損に関連していると述べています。out/out の代わりに ref/var パラメータ修飾子を使用してみました。まだ運がありません。なぜこのエラーが発生するのですか? 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;
正常に動作します。しかし、out パラメーターとして文字列を返す必要があります。