【问题标题】:Problem hosting WebBrowser control in an ATL app在 ATL 应用程序中托管 WebBrowser 控件时出现问题
【发布时间】:2010-03-22 12:37:32
【问题描述】:

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

这个序列在 IE7 下运行良好,但现在我使用的是 IE8,弹出窗口不起作用。显然我错过了一些东西,但我猜不出它可能是什么。任何建议都会非常有帮助。

【问题讨论】:

  • Curioser 和 curioser - 挖掘它似乎正在创建 Internet Explorer 实例,但 Navigate2 事件并未导致它显示,根据文档,这是应该发生的。 Curioser 仍然是,如果我将上面的代码移动到一个函数中并调用函数来创建第一个窗口,那么尽管调用了 navigate2,它仍然保持隐藏状态。彻底迷惑了。

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


【解决方案1】:

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

m_spInPlaceObject = m_spWebBrowser;
_ASSERT(m_spInPlaceObject);

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

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

无论出于何种原因,它在 IE7 上运行,但在 IE8 上却不行。 就我而言,Slack 编码。在 ATL 应用程序中托管 IE 控件仍然一如既往的简洁!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2010-11-14
    • 1970-01-01
    • 2019-06-15
    • 2019-03-19
    • 2010-11-05
    相关资源
    最近更新 更多