在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
编译,但不幸的是,在运行时,我得到以下错误消息:
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
相关文章:
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 调用 "project" 函数和调用 DLL 函数之间的区别
- 代码在 msvcrt .dll函数上设置断点失败
- VB.NET DLL中的C++DLL函数复制
- 在python-ctypes中声明变量并传递给dll函数
- 从 Python 调用 Windows DLL 函数时出错
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- 列出 C# 中的 non-.NET DLL 函数
- 基本 DLL 函数
- 如何在不可修改的源代码中使用 DLL 函数?
- 对需要双精度数组和结构作为输入C++ DLL 函数的 C# 调用
- WScript.CreateObject 在调用 C++ COM dll 函数时返回空
- 如何在 lua cpp 模块中调用托管 c++ dll 函数
- 测试C++ DLL 函数
- 从 C# GUI 将 char * 参数传递给C++ dll 函数
- 使用指针调用C++ DLL 函数
- 在C++中导入 DLL 函数
- #VALUE!在 64 位 Excel 中调用 DLL 函数 (C++) 时
- 如何从 UWP 应用调用"libheif.dll"函数