我使用此声明调用库中的函数(" 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")
它抛出一个异常:" 托管调试助手' PInvokeStackImbalance'已在“MyCode.vshost.exe”中检测到问题。"
我在这里做错了什么?
(我完全清楚这可能是一个愚蠢的问题。然而,当你帮助我解决它时,很多人xsimulator.net会很高兴:))
答案 0 :(得分:2)
您缺少__cdecl
,您应该传递字符串byval
。
<DllImport("wow64ext.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Unicode, ExactSpelling:=True)> _
Public Function GetModuleHandle64(ByVal lpModuleName As String) As ULong
End Function
答案 1 :(得分:2)
你有一些问题。一个是召唤大会。非托管代码使用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