HCRM博客

CEF 报错,如何解决常见的 CEF 错误提示?

CEF报错详解及常见问题解决方案

Chromium Embedded Framework(CEF)是一个基于Google Chromium项目的开源框架,用于在应用程序中嵌入网页浏览功能,虽然功能强大,但在实际使用过程中,开发者可能会遇到各种报错和问题,本文将详细解答CEF报错的常见原因、提供解决方法,并附上相关FAQs。

CEF 报错,如何解决常见的 错误提示?-图1
(图片来源网络,侵权删除)

一、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文件。

CEF 报错,如何解决常见的 错误提示?-图2
(图片来源网络,侵权删除)

2、忽略证书错误提示

错误描述:默认情况下,CEF不会提示用户选择是否忽略证书错误,导致某些需要验证证书的界面无法打开

解决方法:设置settings.ignore_certificate_errors = true;

3、本地化问题

错误描述:在使用CEF时,可能会出现本地化问题,导致界面语言不正确。

解决方法:设置locale和accept_language_list,

CEF 报错,如何解决常见的 错误提示?-图3
(图片来源网络,侵权删除)
     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时,可能会遇到资源未正确释放导致的崩溃。

解决方法:确保在退出前调用CefQuitMessageLoopCefShutdown,并清理所有浏览器对象

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: 确保在退出前调用CefQuitMessageLoopCefShutdown,并清理所有浏览器对象,具体实现可以参考以下代码:

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官方文档或社区论坛获取更多支持。

本站部分图片及内容来源网络,版权归原作者所有,转载目的为传递知识,不代表本站立场。若侵权或违规联系Email:zjx77377423@163.com 核实后第一时间删除。 转载请注明出处:https://blog.huochengrm.cn/gz/20183.html

分享:
扫描分享到社交APP
上一篇
下一篇