2016-08-02 133 views
1

这是一个非常简单的QT + CEF Windows应用程序,请参见https://github.com/GreatTux/CefMinGWQtCEF崩溃时,应用程序退出(QT5 + CEF3.2526)

当我关闭主窗口CEF触发断点: 我想我在这里失败:

void CefBrowserMainParts::PostMainMessageLoopRun() { 
.... 
#ifndef NDEBUG 
// No CefBrowserContext instances should exist at this point. 
DCHECK_EQ(0, CefBrowserContext::DebugObjCt); 
#endif 
} 

我不知道什么是自由浏览器资源的正确方法,我已经看过了很多关于网络的例子,几乎所有的人得到了这个问题,在我的Windows 7 + VS2010 ENV

我也试过但不起作用

void ClientHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) { 
    if(m_browser.get()) 
    m_browser = NULL; 

====跟踪===

libcef.dll!base::debug::BreakDebugger() Line 21 C++ 
libcef.dll!logging::LogMessage::~LogMessage() Line 604 C++ 
libcef.dll!CefBrowserMainParts::PostMainMessageLoopRun() Line 189 C++ 
libcef.dll!content::BrowserMainLoop::ShutdownThreadsAndCleanUp() Line 946 + 0x27 bytes C++ 
libcef.dll!content::BrowserMainRunnerImpl::Shutdown() Line 293 C++ 
libcef.dll!CefMainDelegate::ShutdownBrowser() Line 659 + 0x1b bytes C++ 
libcef.dll!CefContext::FinalizeShutdown() Line 462 C++ 
libcef.dll!CefContext::Shutdown() Line 345 C++ 
libcef.dll!CefShutdown() Line 171 C++ 
libcef.dll!cef_shutdown() Line 192 C++ 
qtloop.exe!CefShutdown() Line 180 + 0x8 bytes C++ 
qtloop.exe!main(int argc=1, char * * argv=0x00375b90) Line 35 C++ 
qtloop.exe!WinMain(HINSTANCE__ * __formal=0x00fe0000, HINSTANCE__ * __formal=0x00fe0000, HINSTANCE__ * __formal=0x00fe0000, HINSTANCE__ * __formal=0x00fe0000) Line 113 + 0xd bytes C++ 
qtloop.exe!__tmainCRTStartup() Line 547 + 0x2c bytes C 
qtloop.exe!WinMainCRTStartup() Line 371 C 

回答

2

当您关闭主窗口,QT没有立即destory,所以CEF浏览器无法释放。此时app.exec()返回,并且CefShowDown()运行并触发调试检查。

我也遇到了同样的问题。 这是因为还存在浏览器不是免费的,当你关机头孢

DCHECK_EQ(0,CefBrowserContext :: DebugObjCt);

我读到这ARTICAL和阅读CEF关闭进程
https://github.com/fanfeilong/cefutil/blob/master/doc/CEF_Close.md

我解决了这个问题的源代码,关键的一点是,当你叫

GETHOST() - > CloseBrowser(false)

关于cef嵌入父窗口的closeEvent并忽略第一个closeEvent

如果用户允许关闭,那么cef将再次接近父根窗口。

void CefBrowserHostImpl::PlatformCloseWindow() { 
    if (window_info_.window != NULL) { 
    HWND frameWnd = GetAncestor(window_info_.window, GA_ROOT); 
    PostMessage(frameWnd, WM_CLOSE, 0, 0); 
    } 
} 

当您收到第二个关闭窗口时,您需要确保关闭窗口并将窗口立即嵌入cef。 Cef需要WM_DESTROY事件来释放资源并调用OnBeforeClose。