VB声明和C ++ DLL调用

时间:2015-12-21 21:12:41

标签: 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 ULong

现在我通过

调用此功能
Dim ntqipHandle as Ulong = GetModuleHandle64("ntdll.dll")

它抛出一个异常:" 托管调试助手' PInvokeStackImbalance'已在“MyCode.vshost.exe”中检测到问题。"

我在这里做错了什么?

(我完全清楚这可能是一个愚蠢的问题。然而,当你帮助我解决它时,很多人xsimulator.net会很高兴:))

2 个答案:

答案 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