Windows 脚本主机 - 错误 '800A01B6' 对象不支持此属性或方法



我的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;
}

最新更新