libcef在win10下的manifest问题

在win10下集成libcef的项目运行时可能看到一个白屏的浏览器窗口,查日志发现报错:

ruby 复制代码
Check failed: fallback_available == base::win::GetVersion() > base::win::Version::WIN8 (1 vs. 0)

这是因为浏览器程序加载不到manifest文件,导致操作系统版本处理错误。

关于这个错误CEF官方的解答是这样的:Check failed: fallback_available

微软官方的解释是这样的:让你的应用程序面向 Windows

解决方案

第一种解决方案,可以通过创建一个manifest文件添加到工程项目中。具体步骤如下:

  • 在工程目录中创建一个manifest文件------xxx.manifest(xxx是可以工程名字或者其他有意义的),文件内容如下:
xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">  
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">  
    <application> 
		<!-- Windows 10 and Windows 11 -->
		<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
		<!-- Windows 8.1 -->
		<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
		<!-- Windows 8 -->
		<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
    </application> 
  </compatibility> 
</assembly>
  • 在项目工程中添加这个manifest文件,添加路径是:在vs项目属性中找到清单工具 ------ 输入和输出 ------ 附加清单文件,添加上刚刚创建的xxx.manifest。

第二种解决方案主要参考了CEF提供的示例程序------cefsimple。具体步骤如下:

  • 拷贝CEF源码中示例程序cefsimple中的 cefsimple.exe.manifest 和 compatibility.manifest (在test\cefsimple中)两个文件到的工程目录下面,并且将cefsimple.exe.manifest名称修改为xxx.exe.manifest(xxx是可以工程名字或者其他有意义的)。
  • 在后期生成事件中加上添加manifest的脚本,添加路径是:在vs项目属性中找到 生成事件 ------ 后期生成事件 ------ 命令行,添加上如下命令,注意替换compatibility.manifest、xxx.exe.manifest和your/path/xxx.exe为你自己的路径,可以用绝对路径:
ruby 复制代码
setlocal
mt.exe -nologo -manifest "compatibility.manifest" "xxx.exe.manifest" -outputresource:"your/path/xxx.exe";#1
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
 
if %errorlevel% neq 0 goto :VCEnd

以上,重新编译程序后就可以看到浏览器正确加载网页,再无报错信息。

优化

针对第二种解决方案,如果vs工程文件是通过cmake生成的还可以参考cefsimple中的cmake脚本优化下。

  • 在CEF工程的cmake文件夹中cef_macros.cmake文件中定义了一个宏:
bash 复制代码
# Add custom manifest files to an executable target.
macro(ADD_WINDOWS_MANIFEST manifest_path target extension)
  add_custom_command(
    TARGET ${target}
    POST_BUILD
    COMMAND "mt.exe" -nologo
            -manifest \"${manifest_path}/${target}.${extension}.manifest\" \"${manifest_path}/compatibility.manifest\"
            -outputresource:"${CEF_TARGET_OUT_DIR}/${target}.${extension}"\;\#1
    COMMENT "Adding manifest..."
    )
endmacro()
  • 将它定义到生成vs工程文件的CMakeLists.txt中,然后添加如下内容(参考test\cefsimple中的CMakeLists.txt),注意修改${YOUR_TARGET}为工程名称。
bash 复制代码
# Add the custom manifest files to the executable.
  ADD_WINDOWS_MANIFEST("${CMAKE_CURRENT_SOURCE_DIR}" "${YOUR_TARGET}" "exe")
  • 如果工程编译出来的不是exe,而是dll,需要修改上面ADD_WINDOWS_MANIFEST中最后一个参数为"dll",相应的也需要修改xxx.exe.manifest文件名为xxx.dll.manifest。
相关推荐
hairenjing11232 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
plmm烟酒僧5 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
Jtti7 小时前
Windows系统服务器怎么设置远程连接?详细步骤
运维·服务器·windows
小奥超人8 小时前
PPT文件设置了修改权限,如何取消权?
windows·经验分享·microsoft·ppt·办公技巧
熊的猫8 小时前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js
科技探秘人10 小时前
Chrome与火狐哪个浏览器的隐私追踪功能更好
前端·chrome
科技探秘人10 小时前
Chrome与傲游浏览器性能与功能的深度对比
前端·chrome
hairenjing112317 小时前
使用 Mac 数据恢复从 iPhoto 图库中恢复照片
windows·stm32·嵌入式硬件·macos·word
守城小轩17 小时前
Chromium127编译指南 Mac篇(五)- 编译Chromium
chrome·chrome devtools·指纹浏览器·浏览器开发
九鼎科技-Leo19 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net