CEF报错详解及常见问题解决方案
Chromium Embedded Framework(CEF)是一个基于Google Chromium项目的开源框架,用于在应用程序中嵌入网页浏览功能,虽然功能强大,但在实际使用过程中,开发者可能会遇到各种报错和问题,本文将详细解答CEF报错的常见原因、提供解决方法,并附上相关FAQs。
一、CEF报错常见原因及解决方法
1、manifest文件缺失导致的错误:
错误描述:在Win10下集成libcef的项目运行时可能看到一个白屏的浏览器窗口,查日志发现报错:Check failed: fallback_available == base::win::GetVersion() > base::win::Version::WIN8 (1 vs. 0)。
解决方法:
方案一:在工程目录中创建一个manifest文件(如xxx.manifest),内容如下:
<?xml version="1.0" encoding="utf8"?> <assembly xmlns="urn:schemasmicrosoftcom:asm.v1" manifestVersion="1.0"> <compatibility xmlns="urn:schemasmicrosoftcom:compatibility.v1"> <application> <supportedOS Id="{8e0f7a12bfb34fe8b9a548fd50a15a9a}"/> <supportedOS Id="{1f676c7680e1423995bb83d0f6d0da78}"/> <supportedOS Id="{4a2f28e353b94441ba9cd69d4a4a6e38}"/> </application> </compatibility> </assembly>
然后在项目属性中添加该manifest文件。
方案二:参考CEF提供的示例程序cefsimple,拷贝其中的cefsimple.exe.manifest和compatibility.manifest文件到工程目录,并在后期生成事件中添加脚本以合并manifest文件。
2、忽略证书错误提示:
错误描述:默认情况下,CEF不会提示用户选择是否忽略证书错误,导致某些需要验证证书的界面无法打开。
解决方法:设置settings.ignore_certificate_errors = true;
。
3、本地化问题:
错误描述:在使用CEF时,可能会出现本地化问题,导致界面语言不正确。
解决方法:设置locale和accept_language_list,
const char* loc = "zhCN"; CefString(&settings.locale).FromASCII(loc); CefString(&settings.accept_language_list).FromASCII(loc);
4、Flash自动打开问题:
错误描述:在CEF70中,Flash无法自动打开。
解决方法:在命令行处理函数中添加以下代码:
void QCefRenderApp::OnBeforeCommandLineProcessing(const CefString &process_type, CefRefPtr<CefCommandLine> command_line) { command_line>AppendSwitchWithValue("enablesystemflash", "1"); }
5、编译CEF出错:
错误描述:编译CEF时出现各种错误,例如MSB3073错误。
解决方法:确保所有必要的文件都正确复制到指定文件夹,并根据需要修改CMakeLists.txt中的配置。
6、退出流程错误:
错误描述:在退出CEF时,可能会遇到资源未正确释放导致的崩溃。
解决方法:确保在退出前调用CefQuitMessageLoop
和CefShutdown
,并清理所有浏览器对象。
7、内存溢出错误:
错误描述:单进程模式下,CEF可能会导致内存溢出错误。
解决方法:在初始化CEF时,将single_process
设置为false以启用多进程模式。
8、缓存路径设置:
错误描述:CEF启动后一直白屏。
解决方法:确保在调用CefInitialize
之前没有创建实例代码,或者将缓存路径设置为默认值。
二、相关FAQs
Q1: 如何在项目中添加manifest文件?
A1: 可以在工程目录中创建一个manifest文件(如xxx.manifest),内容如下:
<?xml version="1.0" encoding="utf8"?> <assembly xmlns="urn:schemasmicrosoftcom:asm.v1" manifestVersion="1.0"> <compatibility xmlns="urn:schemasmicrosoftcom:compatibility.v1"> <application> <supportedOS Id="{8e0f7a12bfb34fe8b9a548fd50a15a9a}"/> <supportedOS Id="{1f676c7680e1423995bb83d0f6d0da78}"/> <supportedOS Id="{4a2f28e353b94441ba9cd69d4a4a6e38}"/> </application> </compatibility> </assembly>
然后在项目属性中添加该manifest文件。
Q2: 如何解决CEF退出时崩溃的问题?
A2: 确保在退出前调用CefQuitMessageLoop
和CefShutdown
,并清理所有浏览器对象,具体实现可以参考以下代码:
void SimpleHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) { CEF_REQUIRE_UI_THREAD(); BrowserList::iterator bit = browser_list_.begin(); for (; bit != browser_list_.end(); ++bit) { if ((*bit)>IsSame(browser)) { browser_list_.erase(bit); break; } } if (browser_list_.empty()) { is_can_quit_ = true; } } void QtWidgetsApplication1::WaitCefQuit() { while (!simple_handler_>IsCanQuit()) { Sleep(500); qApp>processEvents(); } } int main(int argc, char *argv[]) { widget.WaitCefQuit(); CefShutdown(); return 0; }
通过以上详细的解答和常见问题的解决方案,希望能帮助开发者更好地理解和解决CEF报错问题,如果在实际开发中遇到其他问题,建议查阅CEF官方文档或社区论坛获取更多支持。