Vb.net VB声明和C++;DLL调用
我使用此声明调用库中的函数(“wow64ext.dll”) < C++库中的声明>:Vb.net VB声明和C++;DLL调用,vb.net,pinvoke,Vb.net,Pinvoke,我使用此声明调用库中的函数(“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 ULon
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")
它引发异常:“托管调试助手‘PinvokeStackDistrication’检测到‘MyCode.vshost.exe’中存在问题。”
我做错了什么
(我完全知道这可能是一个愚蠢的问题。然而,当你帮我解决它时,在场的很多人都会很高兴:)你缺少
\uu cdecl
,你应该传递字符串byval
<DllImport("wow64ext.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Unicode, ExactSpelling:=True)> _
Public Function GetModuleHandle64(ByVal lpModuleName As String) As ULong
End Function
_
公共函数GetModuleHandle64(ByVal lpModuleName作为字符串)作为ULong
端函数
您缺少\uu cdecl
,您应该传递字符串byval
<DllImport("wow64ext.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Unicode, ExactSpelling:=True)> _
Public Function GetModuleHandle64(ByVal lpModuleName As String) As ULong
End Function
_
公共函数GetModuleHandle64(ByVal lpModuleName作为字符串)作为ULong
端函数
您有一些问题。一是通话约定。非托管代码使用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
_
公共函数GetModuleHandle64(ByVal lpModuleName作为字符串)作为ULong
端函数
您有一些问题。一是通话约定。非托管代码使用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
_
公共函数GetModuleHandle64(ByVal lpModuleName作为字符串)作为ULong
端函数
Hi David非常感谢您的快速回答。你的代码马上就可以工作了,我可以继续从32位程序中读取64位内存,并为xsimulator.net编写插件:)嗨,大卫,非常感谢你的快速回答。你的代码马上就可以工作了,我可以继续从32位程序中读取64位内存,并为xsimulator.net编写插件:)谢谢你们的快速回答!(我学到了很多;)谢谢你们两位的快速回答!现在的工作很有魅力:)(我学到了很多;)