我需要从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签名的参数与目标非托管匹配 签名。
我该如何解决这个问题?
答案 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