在VB中签名DLL函数

DLL function signature in VB

本文关键字:DLL 函数 VB      更新时间:2023-10-16

我需要从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

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

pinvokestack失衡被检测到消息:调用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#项目禁用了pinvokestack失衡MDA

您可以在VB中使用DllImport属性。净了。这实际上是。net原生的实现方式。Declare主要用于旧版本的VB。

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