繁体   English   中英

VB中的DLL函数签名

[英]DLL function signature in VB

我需要从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签名的调用约定和参数是否与目标非托管签名匹配。

我该如何解决?

问题是,通常情况下,调用约定不匹配。 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。

您也可以在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM