我的C++ Windows包装器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: Object不支持此属性或方法的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: Object不支持此属性或方法的WinAPI_EnumWindows`。
发布于 2017-07-15 14:00:56
我通过清除一个由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;
}
https://stackoverflow.com/questions/45117822
复制相似问题