1

私はこの関数を持つdelphidllを持っています:

function writeRate(data: variant):Double ; stdcall;

このメソッドを使用して、c#から関数を呼び出しました。

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate double WriteRate(object data);
protected void UpdateRateChannel(string myData)
{   
    IntPtr pDll = NativeMethods.LoadLibrary("mydll.dll");

    IntPtr pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "writeRate");
    WriteRate writeRate = (WriteRate)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(WriteRate ));


    double response = writeRate(myData);

    bool result = NativeMethods.FreeLibrary(pDll);
}

しかし、私はこの例外を受け取ります:

PInvokeStackImbalance was detected

dllを呼び出すにはどうすればよいですか?問題はバリアント型にあると思いました。ありがとう!

4

3 に答える 3

5

stdcallDelphi コードでCallingConvention.StdCallは、C# と一致します。デリゲートの定義を修正する必要があります。

于 2012-05-10T10:45:52.410 に答える
4

Delphi関数がであると宣言されているstdcall場合、なぜC#で次のように宣言するのでしょうcdeclか。

これがスタックの不均衡の原因です。stdcallDelphi宣言と一致する規則を使用するように、C#宣言を変更します。

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate double WriteRate(object data);
于 2012-05-10T11:02:54.473 に答える
0

C# のバリアントは、おそらく Delphi の通常のバリアントと互換性がありません。代わりに Delphi の OleVariant を使用してください。

于 2012-05-10T10:47:56.620 に答える