2015-12-21 86 views
1

我打电话库( “wow64ext.dll”)的功能与此声明声明VB和C++ DLL调用

宣言C++库:

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

我在VB声明。网方案是:

现在,当我通过

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

它引发异常:“托管调试助手'PInvokeStackImbalance'在'MyCode.vshost.exe'中检测到问题。

我在做什么错在这里?

(我深知,这可能会对xsimulator.net问题。不过这么多的人在会高兴的时候你帮我解决它:))

回答

1

你有一些问题。一个是调用约定。非托管代码使用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 
+0

嗨大卫感谢您为您的快速回答。 您的代码可以马上使用,我可以从32位程序和xsimulator.net的编码插件继续读取64位内存:) – value1

1

你缺少__cdecl,你应该传递一个字符串byval

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

谢谢两位为您快速解答!像现在的魅力工作:) (和我学到了很多;) – value1