C#からDelphiで開発された外部提供のDLLを呼び出そうとしています。ただし、Delphiタイプの「ポインタ」のパラメータを渡そうとしたときに関数を呼び出すと、常にスタックの不均衡エラーが発生するようです。
DLLの開発者によって提供された定義は次のとおりです。
procedure SetSeparator( const aIsEuropean: Pointer ); stdcall;
external 'DLLName.dll';
C#での私の前方宣言は次のとおりです。
[DllImport(EXPERT_RT_NAME, EntryPoint = "SetSeparator",
CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void SetSeparator(string strSeparator);
C#でこれを呼び出すコードは次のとおりです。
string s = "1";
SetSeparator(s);
呼び出されたときに受信したエラーは次のとおりです。
PInvoke関数'::SetSeparator'の呼び出しにより、スタックのバランスが崩れました。これは、マネージドPInvokeシグニチャがアンマネージドターゲットシグニチャと一致しないことが原因である可能性があります。PInvokeシグニチャの呼び出し規約とパラメータがターゲットのアンマネージドシグニチャと一致することを確認してください。
呼び出し規約が指定されているので、大丈夫だと確信しています。パラメータが問題だと思いますか?
PInvokeマーシャリングを変更し、IntPtrを使用して、パラメーターの周りのさまざまなオプションを変更してみました。動作しているように見える別の(パラメーターなしの)呼び出しがあります(ただし、これと他のいくつかの同様の呼び出しでDLLを初期化できるまで、確信が持てません)。
また、情報を受け取るためにポインタを渡す必要がある呼び出しもあります。
私はすでにこれを再調査するのに多くの時間を費やしており、関連性がありオプションが不足していると私が見ることができるすべてをフォローアップしているにもかかわらず、誰かが助けてくれることを願っています。
残念ながら、Delphiコードのソースコードにアクセスできません。