【发布时间】:2017-12-20 10:21:40
【问题描述】:
我的 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 位,为了 WSH 的兼容性,dll 仅针对 64 位平台编译。
更新
当我使用相同的函数两次时也会发生此错误,如下所示:
Dim WINAPI: Set WINAPI = WScript.CreateObject("WinAPIWrapperLib.WINAPI")
WINAPI.WinAPI_EnumWindows 0
WINAPI.WinAPI_EnumWindows 0
在执行第二行时,它说:
错误 800A01B6:对象不支持此属性或方法 'WinAPI_EnumWindows`。
【问题讨论】: