我的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`。
答案 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;
}