使用c#中的variant类型参数调用delphi dll

时间:2012-05-10 10:30:14

标签: c# delphi dll

我有一个带有此功能的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?我认为该问题属于变体类型。 谢谢!

3 个答案:

答案 0 :(得分:5)

Delphi代码中的

stdcall与C#中的CallingConvention.StdCall匹配。你应该修改你的委托定义。

答案 1 :(得分:4)

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

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

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate double WriteRate(object data);

答案 2 :(得分:0)

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