Windows Script Host — ошибка «800A01B6» Объект не поддерживает это свойство или метод

У меня странная ошибка с моей 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.

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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]