Vb.net VB声明和C++;DLL调用

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

我使用此声明调用库中的函数(“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")
它引发异常:“托管调试助手‘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编写插件:)谢谢你们的快速回答!(我学到了很多;)谢谢你们两位的快速回答!现在的工作很有魅力:)(我学到了很多;)