假设我有一个实现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指针)?
如果你从未尝试过,请不要发帖。感谢。