上面的程序在退出时,会崩溃(Release模式不会崩溃)。

接下来把libcef.dll.pdb解压到我们的程序目录,调试运行,看一下崩溃点。

调试发现崩溃在:

libcef.dll!`anonymous namespace'::CefShutdownChecker::~CefShutdownChecker()


这是网上文章中使用较多的关闭流程,但在Debug模式下仍然会在退出后崩溃。

bool MyCefClient::DoClose(CefRefPtr<CefBrowser> browser)
{
    base::AutoLock lock_scope(lock_);
    browser_ = NULL;
 
    // 返回false之后,主窗口会再次收到WM_CLOSE
    return  false;
}
 
void CHelloCefDlg::OnClose()
{
    CefRefPtr<CefBrowser> browser = handler->GetBrowser();
    if (browser != NULL)
    {
        // 此时触发DoClose
        // 但会导致OnBeforeClose不执行
        browser->GetHost()->CloseBrowser(false);
        return;
    }
 
    CDialogEx::OnClose();
}

因此,我们以后就只使用Release版本吧(暂时)。


本文链接地址: LibCef的使用6-退出时崩溃的问题
https://blog.qingfengju.com/index.asp?id=433

分类:Win32/C++ 查看次数:461 发布时间:2020/5/6 8:00:52

打算嵌入在窗口内使用,不需要弹出新窗口(也没有选项卡)。

这一次,我们需要实现的接口函数是:

bool MyCefClient::OnBeforePopup(CefRefPtr<CefBrowser> browser,
	CefRefPtr<CefFrame> frame,
	const CefString& target_url,
	const CefString& target_frame_name,
	WindowOpenDisposition target_disposition,
	bool user_gesture,
	const CefPopupFeatures& popupFeatures,
	CefWindowInfo& windowInfo,
	CefRefPtr<CefClient>& client,
	CefBrowserSettings& settings,
	CefRefPtr<CefDictionaryValue>& extra_info,
	bool* no_javascript_access)
{
	switch (target_disposition)
	{
	case WOD_NEW_FOREGROUND_TAB:
	case WOD_NEW_BACKGROUND_TAB:
	case WOD_NEW_POPUP:
	case WOD_NEW_WINDOW:
		browser->GetMainFrame()->LoadURL(target_url);
		return true; //停止创建
	}

	return false;
}



本文链接地址: LibCef的使用5-所有链接在同一窗口打开
https://blog.qingfengju.com/index.asp?id=432

分类:Win32/C++ 查看次数:443 发布时间:2020/5/5 8:00:06