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
我正在使用此声明调用库 ("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