VB 声明和 C++ DLL 调用

VB Declaration and C++ DLL call

我正在使用此声明调用库 ("wow64ext.dll") 中的函数

C++ 库中的声明:

extern "C" __declspec(dllexport) DWORD64 __cdecl GetModuleHandle64(wchar_t* lpModuleName)

我在VB.net程序中的声明是:

Public Declare Function GetModuleHandle64 Lib "wow64ext.dll" (ByRef lpModuleName As String) As ULong

现在当我通过

调用这个函数时
Dim ntqipHandle as Ulong = GetModuleHandle64("ntdll.dll")

它抛出异常:“Managed Debugging Assistant 'PInvokeStackImbalance' 在 'MyCode.vshost.exe'. 中检测到问题”

我做错了什么?

(我完全意识到这可能是一个 愚蠢的 问题。尽管如此,xsimulator.net 的很多人都会很高兴帮我解决一下:) )

您缺少 __cdecl,您应该传递字符串 byval

<DllImport("wow64ext.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Unicode, ExactSpelling:=True)> _
Public Function GetModuleHandle64(ByVal lpModuleName As String) As ULong
End Function

你有一些问题。一种是调用约定。非托管代码使用 cdecl。您的代码使用 stdcall。另一个问题是字符串。非托管代码使用 UTF-16 文本,您的代码使用 ANSI 编码文本。传递 ByRef 也是错误的。现在不建议使用 Declare。这就是你在旧的 VB6 时代做事的方式。现在我们有 VB.net,您应该使用 p/invoke。它更加灵活和强大。

像这样修复它:

<DllImport("wow64ext.dll", CallingConvention := CallingConvention.Cdecl, _
    CharSet := CharSet.Unicode)> _
Public Function GetModuleHandle64(ByVal lpModuleName As String) As ULong
End Function