Предполагая, что у меня есть класс, который реализует интерфейс DShellWindowsEvents и регистрирует его с помощью окон оболочки; Метод OnWindowRegistered
вызывается всякий раз, когда открывается новое окно IE или Explorer со значением cookie в качестве первого параметра. Используя это значение cookie, я смогу позвонить FindWindowSW
и получить только что зарегистрированное окно. Тем не менее, он всегда возвращает S_FALSE без значений.
Вот соответствующий код:
HRESULT MyShellWindows::OnWindowRegistered(LONG cookie)
{
CComPtr<IDispatch> p_browser_disp;
CComVariant v_cookie(cookie), v_empty;
long window_handle = 0;
HRESULT res = m_shell->FindWindowSW(
&v_cookie,
&v_empty,
SWC_BROWSER,
&window_handle,
SWFO_COOKIEPASSED|SWFO_NEEDDISPATCH,
&p_browser_disp
);
assert(res == S_OK); // returns S_FALSE.
}
Результатом всегда является S_FALSE, и не возвращается ни указатель IDispatch
, ни дескриптор окна. Я попробовал несколько комбинаций для флагов, и я попробовал Квартиру и Свободную Нарезку. Я даже пытался сохранить cookie и отложить вызов, чтобы избежать повторного входа в объект IShellWindows. Редактировать: Я также попробовал множество комбинаций типов вариантов напрямую и по ссылке в качестве значения cookie, IIRC все типы VT_I * и VT_U *, а также некоторые напрямую и по ссылке.
Итак, вот вопрос:
Как получить действительный результат (S_OK и дескриптор окна или указатель IDispatch) из FindWindowSW
вызова из файла cookie?
Пожалуйста, не пишите, если вы никогда не пытались. Спасибо.