在ATL应用程序中托管WebBrowser控件的问题

时间:2010-03-20 00:16:04

标签: internet-explorer-8 internet-explorer-7 atl

我有一个遗留的atl应用程序,它在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嵌入 - &gt; Shell DocObject视图 - &gt; Internet Explorer_Server。当弹出窗口(通过NewWindow3检测到)时,我启动一个新窗口并为新窗口执行相同的代码序列。在弹出窗口中,navigate2不起作用,当我在spy ++中查看这个新窗口时,我只有Shell嵌入。即使我在启动时实例化弹出窗口,我也会遇到同样的问题,因此它根本与NewWindow3无关 - 即使所有调用都返回S_OK,似乎Web控件的第二个实例也没有实例化。

这个序列在IE7下工作正常但现在我使用IE8并且弹出窗口无效。显然我缺少一些东西,但我猜不出它可能是什么。任何建议都会非常有用。

1 个答案:

答案 0 :(得分:0)

事实证明,当我创建主窗口时,我调用了

m_spInPlaceObject = m_spWebBrowser;
_ASSERT(m_spInPlaceObject);

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

但是我在弹出初始化中没有这个调用。一旦我将其添加到弹出窗口初始化,它就可以正常工作。

无论出于何种原因,它适用于IE7,但不适用于IE8。 松弛编码对我而言。在ATL应用程序中托管IE控件仍然像以前一样整洁!

相关问题