1

我有一个带有这个功能的delphi dll:

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

stdcall在 Delphi 代码中匹配CallingConvention.StdCallC#。您应该修复您的委托定义。

于 2012-05-10T10:45:52.410 回答
4

如果 Delphi 函数被声明为 is stdcall,为什么在 C# 中将其声明为cdecl

这就是堆栈不平衡的原因。更改您的 C# 声明以使用stdcall约定来匹配 Delphi 声明。

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

C# 中的 Variant 可能与 Delphi 中的普通 Variant 不兼容。改用 Delphi 的 OleVariant。

于 2012-05-10T10:47:56.620 回答