2015-12-21 137 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