【问题标题】:Calling a delphi dll with a variant type parameter from c#从 c# 调用带有变体类型参数的 delphi dll
【发布时间】:2012-05-10 10:30:13
【问题描述】:

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

【问题讨论】:

  • 请问您为什么不使用“通常”的 PInvoke 方式导入函数,例如[DllImport("mydll.dll")]private static extern ...
  • @ThorstenDittmar 如果您希望运行时控制 DLL 的位置,这就是这样做的方法。
  • 啊!太好了 - 不知道你可以那样做。谢谢!

标签: c# delphi dll


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这不可能。错误为PInvokeStackImbalance was detected,可能是调用约定不匹配造成的。
      • 在那种情况下,我的回答不是针对当前问题,而是针对下一个问题。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多