我的C++Windows API包装器dll遇到了一个奇怪的错误。我已经用这个dll向COM公开了六种方法。当我单独使用它们时,每个函数都可以工作,但是当我在 VBScript 中使用 COM 公开的方法时,例如:
Dim AutoItX3: Set AutoItX3 = WScript.CreateObject("AutoItX3.Control")
Dim WINAPI: Set WINAPI = WScript.CreateObject("WinAPIWrapperLib.WINAPI")
WINAPI.WinAPI_EnumWindows 0
WINAPI.WinAPI_ShowWindow CLng("&h" + Replace(AutoItX3.WinGetHandle("[CLASS:Notepad]"), "0x", "")), 1
EnumWindows
工作正常,但是当 WSH 进入ShowWindow
行时,它说:
错误 800A01B6:对象不支持此属性或方法"WinAPI_ShowWindow"。
但为什么会这样呢?此对象支持此方法并很好地实现。
当我只使用ShowWindow
时,例如:
Dim AutoItX3: Set AutoItX3 = WScript.CreateObject("AutoItX3.Control")
Dim WINAPI: Set WINAPI = WScript.CreateObject("WinAPIWrapperLib.WINAPI")
WINAPI.WinAPI_ShowWindow CLng("&h" + Replace(AutoItX3.WinGetHandle("[CLASS:Notepad]"), "0x", "")), 1
它可以毫无问题地工作。通过使用上述这两个函数,可以非常轻松地重现此错误。
我如何实现 COM 类:
coclass WinAPI
{
[default] interface IWinAPI;
[default, source] dispinterface _IWinAPIEvents;
};
运行上述脚本的系统是 Windows 7 64 位,并且 dll 仅针对 64 位平台编译,以实现 WSH 的兼容性。
更新
当我使用相同的函数两次时,也会发生此错误,如下所示:
Dim WINAPI: Set WINAPI = WScript.CreateObject("WinAPIWrapperLib.WINAPI")
WINAPI.WinAPI_EnumWindows 0
WINAPI.WinAPI_EnumWindows 0
当谈到执行第二行时,它说:
错误 800A01B6:对象不支持此属性或方法"WinAPI_EnumWindows"。
我通过清除回调函数使用的BSTR
变量来解决EnumWindowsProc
如下所示:
BSTR WindowClassName; //<< DECLARATION >>
RealGetWindowClass(hWnd, WindowClassName, 8192); // << USAGE IN EnumWindowsProc >>
STDMETHODIMP CWinAPI::WinAPI_EnumWindows(int lParam)
{
SysFreeString(WindowClassName); // << CLEARING >>
EnumWindows(EnumWindowsProc, lParam);
SysFreeString(WindowClassName); // << CLEARING >>
return S_OK;
}