Как заставить IShellWindows-> FindWindowSW работать с SWFO_COOKIEPASSED - PullRequest
0 голосов
/ 16 января 2012

Предполагая, что у меня есть класс, который реализует интерфейс 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?

Пожалуйста, не пишите, если вы никогда не пытались. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...