hB0*_*hB0 4 c++ atl webbrowser-control visual-studio-2010 iwebbrowser2
我在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);
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
Cza*_*zak 10
关闭webbrowser控件时,我遇到了"访问冲突"的许多问题,这些步骤对我有用:
_variant_t v; v.vt = VT_DISPATCH; v.pdispVal = 0; IHTMLDocument2->put_onclick(v);IWebBrowser2->Stop()IWebBrowser2->ExecWB(OLECMDID_CLOSE, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0) - 当通过window.external.CloseWindow()关闭浏览器窗口时,我有未处理的异常,OLECMDID_CLOSE修复了它.IWebBrowser2->put_Visible(VARIANT_FALSE)IWebBrowser2->Release()IOleInPlaceObject->InPlaceDeactivate()IOleInPlaceObject->Release()IOleObject->DoVerb(OLEIVERB_HIDE, NULL, IOleClientSite, 0, windowHandle_, NULL)IOleObject->Close(OLECLOSE_NOSAVE)OleSetContainedObject(IOleObject, FALSE)IOleObject->SetClientSite(NULL)CoDisconnectObject(IOleObject, 0)IOleObject->Release()IWebBrowser2->Quit() 不应该为WebBrowser控件(CLSID_WebBrowser)调用它,它仅适用于Internet Explorer对象(CLSID_InternetExplorer).
为什么一定要这么难?
我的经验是,某些调用可能需要消息处理才能正常运行。尝试在调用之间发送一些消息Navigate,Stop等等。在使用网络浏览器界面时,我PostMessage自己经常触发下一步,以确保上一步有时间完成。
该问题可能与您的子线程有关。如果不做一些额外的工作,您就无法在线程之间访问 Web 浏览器界面。COM 需要初始化为单线程单元 (STA)。并且您需要遵守STA的规则: