如何让IShellWindows-> FindWindowSW与SWFO_COOKIEPASSED一起使用

时间:2012-01-16 16:19:34

标签: windows com

假设我有一个实现DShellWindowsEvents接口的类并将其注册到shell窗口;只要打开一个新的IE或资源管理器窗口,并将cookie值作为第一个参数,就会调用OnWindowRegistered方法。使用此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 *类型加上一些更直接和参考。

所以,问题是:

如何从Cookie的FindWindowSW调用中获取有效结果(S_OK和窗口句柄或IDispatch指针)?

如果你从未尝试过,请不要发帖。感谢。

0 个答案:

没有答案