VB

时间:2016-08-12 10:31:54

标签: c# c++ vb.net visual-studio-2010 pinvoke

我需要从VB应用程序调用DLL函数。该函数声明为

extern "C"  __declspec(dllexport) int Average(HBITMAP SrcHandle, HBITMAP DstHandle)
DLL中的

,用C ++编写。

我可以在C#程序中使用声明

无缝地调用它
[DllImport("Integrate.dll")]
public static extern int Average(IntPtr SrcHandle, IntPtr DstHandle);

然后在VB中尝试

Declare Function Average Lib "Integrate.dll" _
   (ByVal SrcHandle As IntPtr, ByVal DstHandle As IntPtr) As Integer

这编译但不幸的是在运行时我得到以下错误消息:

  

检测到PInvokeStackImbalance消息:调用PInvoke函数   'TestVB!WindowsApplication1.Form1 :: Average'使堆栈失衡。   这可能是因为托管的PInvoke签名不匹配   非托管目标签名。检查调用约定和   PInvoke签名的参数与目标非托管匹配   签名。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

问题是,通常情况下,调用约定的不匹配。 C代码使用cdecl,VB代码使用stdcall。导入函数时需要指定调用约定,这意味着需要p / invoke。

<DllImport("Integrate.dll", CallingConvention:=CallingConvention.Cdecl)> _
Public Shared Function Average(ByVal SrcHandle As IntPtr, _
    ByVal DstHandle As IntPtr) As Integer
End Function

请注意,出于同样的原因,您的C#代码也是错误的。它应该是:

[DllImport("Integrate.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int Average(IntPtr SrcHandle, IntPtr DstHandle);

我只能想象您的C#项目已禁用PInvokeStackImbalance MDA。

答案 1 :(得分:0)

您也可以在VB.NET中使用DllImport属性。它实际上是本机.NET的方式。 Declare主要用于旧版本的VB。

<DllImport("Integrate.dll")> _
Public Shared Function Average(ByVal SrcHandle As IntPtr, ByVal DstHandle As IntPtr) As Integer
End Function