5

我在 VisualC++10 中使用 ATL 来托管浏览器控件。我的代码类似于这个例子: http: //msdn.microsoft.com/en-us/library/9d0714y1 (v=vs.80).aspx

区别是我有主窗口,然后子窗口托管浏览器控件。2 分钟后,我必须关闭浏览器,完全杀死浏览器 activeX,但这个子窗口应该是活动的并做其他事情。但不知何故,这个浏览器控件仍然留在那里,我可以看到滚动条或其他东西..

我还尝试通过为现有子窗口创建子窗口,然后在关闭浏览器时销毁这个孩子的孩子 - 但它仍然不起作用!

这就是我关闭的方式:

CLOSE()
{
    m_spIWebBrowser2->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
    m_spIWebBrowser2->Stop();
    m_spIWebBrowser2->put_Visible(VARIANT_FALSE);
    m_spIWebBrowser2->Quit();
    DestroyWindow(m_wndChild.m_hWnd);
}

谢谢!

4

3 回答 3

12

关闭 webbrowser 控件时,我遇到了很多“访问冲突”问题,这些步骤对我有用:

  1. 取消任何先前建议的事件(在我的例子中是 DWebBrowserEvents2)。
  2. 如果您附加了点击事件,请像这样取消附加它们:_variant_t v; v.vt = VT_DISPATCH; v.pdispVal = 0; IHTMLDocument2->put_onclick(v);
  3. IWebBrowser2->Stop()
  4. IWebBrowser2->ExecWB(OLECMDID_CLOSE, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0)- 通过 window.external.CloseWindow() 关闭浏览器窗口时,我遇到了未处理的异常,OLECMDID_CLOSE 修复了它。
  5. IWebBrowser2->put_Visible(VARIANT_FALSE)
  6. IWebBrowser2->Release()
  7. IOleInPlaceObject->InPlaceDeactivate()
  8. IOleInPlaceObject->Release()
  9. IOleObject->DoVerb(OLEIVERB_HIDE, NULL, IOleClientSite, 0, windowHandle_, NULL)
  10. IOleObject->Close(OLECLOSE_NOSAVE)
  11. OleSetContainedObject(IOleObject, FALSE)
  12. IOleObject->SetClientSite(NULL)
  13. CoDisconnectObject(IOleObject, 0)
  14. IOleObject->Release()

IWebBrowser2->Quit()不应为 WebBrowser 控件 (CLSID_WebBrowser) 调用,它仅适用于 Internet Explorer 对象 (CLSID_InternetExplorer)。

为什么一定要这么难?

于 2013-02-01T18:20:18.287 回答
0

我的经验是,某些呼叫可能需要消息处理才能正常运行。尝试在您的呼叫之间发送一些消息NavigateStop等等。在使用网络浏览器界面时,我PostMessage自己经常触发下一步以确保上一步有时间完成。

该问题可能与您的子线程有关。如果没有一些额外的工作,您将无法访问线程之间的 Web 浏览器界面。COM 需要初始化为单线程单元 (STA)。您需要遵守STA 的规则

  • 每个对象都应该只存在于一个线程上(在单线程单元内)。为每个线程初始化 COM 库。
  • 在公寓之间传递对象时,对所有指向对象的指针进行编组。
  • 每个单线程单元必须有一个消息循环来处理来自同一进程内其他进程和单元的调用。没有对象的单线程公寓(仅限客户端)也需要一个消息循环来分派某些应用程序使用的广播消息。
  • ...
于 2011-11-28T10:56:39.873 回答
0

如果我使用 DialogBox 并在其上放置一个 IEControl 作为资源,并且 DialogBox 是从 CAxDialogImpl<> 派生的 - 那么当我调用 dialogBox 的 DestroyWindow() 时,它会自动执行 cleanup() - 这是我所需要的。但最初我想摆脱 DialogBox 本身并直接在我的 Window 上使用 IEControl,似乎没有..

于 2011-11-30T13:11:31.107 回答