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

时间:2017-07-15 11:46:23

标签: c++ vbscript com atl wsh

我的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`。

1 个答案:

答案 0 :(得分:0)

我通过清除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;
}