Iは、次のコードを使用して、ネイティブDelphiのDLLを呼び出し、C#アプリケーションを有する:64ビットの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ビットアプリケーションで問題なく動作します。しかし、C#exeとDelphi dllの両方を64ビットでコンパイルすると、奇妙な問題が発生します。 DelphiデバッガでGetStringを呼び出すと、.NETコードのどこかで例外が発生し、デバッガの出力ウィンドウに次の文字列が表示されることがわかります。"Critical error detected c0000374"。 Googleでは、このエラーはヒープの破損に関連していると言います。 私はアウト/アウトの代わりにref/varパラメータ修飾子を使ってみました。まだ運がありません。このエラーが発生するのはなぜですか?私は64ビットのために別の呼び出し規約を使うべきですか?
BTW。以下の組み合わせが正常に動作します:
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パラメータとして文字列を返す必要があります。
はどうもありがとうございました!あなたは私にこの問題で数時間の戦いをさせてくれました。 – Max
'PChar'?チャンスの試合は 'PAnsiChar'か' PWideChar'でしたか? (もちろん、それは64ビットXE2であると推測できますが、このコードを64ビットFPCでコンパイルしたり、32ビットプロジェクトにコピーしたりすることはできません。 –
@ Arioch'The次に、 'PWideChar'もしあなたが好きなら。 –