2010-03-20 107 views
1

我有一个遗留atl应用程序,在ATL窗口中托管webbrowser控件。我创建了一个客户端实例来使用以下序列来托管浏览器:在ATL应用程序中托管WebBrowser控件的问题

CComPtr<IOleObject> spOleObject; 
HRESULT hr = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC, ID_IOleObject,(void**)&spOleObject); 

spOleObject->SetClientSite(this); 
GetClientRect(&rcClient); 
hr = spOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, &msg, this, 0, m_hWnd, &rcClient); 

hr = AtlAdvise(m_spWebBrowser, GetUnknown(), DIID_DWebBrowserEvents2, &m_dwCookie); 

CComVariant navvar(navurl); 
m_spWebBrowser->Navigate2(&navvar, NULL, NULL, NULL, NULL); 

此序列可以很好地创建初始浏览窗口。对navigate2的调用工作,如果我通过spy ++查看窗口,我有Shell嵌入 - > Shell DocObject视图 - > Internet Explorer_Server。当出现弹出窗口(通过NewWindow3检测到)时,我将启动一个新窗口并为新窗口执行相同的代码序列。在弹出窗口中,navigate2不起作用,当我在spy ++中查看这个新窗口时,我只有Shell嵌入。即使在启动时实例化弹出窗口,我也会遇到同样的问题,因此它与NewWindow3根本无关 - 看起来Web控件的第二个实例并未实例化,即使所有调用都返回S_OK。

这个序列在IE7下工作正常,但现在我使用IE8和弹出窗口不工作。显然我缺少了一些东西,但我不知道它会是什么。任何建议都会非常有帮助。

+0

古怪的人和古怪的人 - 挖掘它出现的Internet Explorer实例正在创建,但Navigate2事件不会导致它被显示,根据文档是什么应该发生。 古怪的人仍然是,如果我将上面的代码移动到一个函数并进行函数调用来创建第一个窗口,它仍然保持隐藏,尽管navigate2调用以及。 彻底困惑。 – 2010-03-20 13:17:09

回答

0

原来,当我创建的主窗口我叫

m_spInPlaceObject = m_spWebBrowser; 
_ASSERT(m_spInPlaceObject); 

if (m_spInPlaceObject) 
    m_spInPlaceObject->SetObjectRects(&rcClient, &rcClient); 

但我没有在弹出初始化此调用。一旦我将它添加到弹出式初始化,它工作正常。

无论出于何种原因,它在IE7上工作,但不在IE8上。 我的部分编码冗余。在ATL应用中托管IE控件仍然像以往一样整洁!

相关问题