У меня странная ошибка с моей DLL библиотеки оболочки C ++ Windows. Я уже выставил шесть методов COM с этой DLL. Каждая функция работает, когда я использую их по отдельности, но когда я использую COM-методы в VBScript, например:
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;
};
Моя система, которая работает над сценарием, является 64-битной Windows 7, и 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;
}
Других решений пока нет …