文章目录
- 前言
- 1、cef简介和下载编译
- 2、嵌入到工程框架中遇到的问题
- 3、VisualStudio2017、2019编译
- 4、如何使用编译好的库以及相关动态文件
- 5、注意
- 6、常见问题
- 7、cef的通信及同步调用JS
前言
最近一段时间忙着把浏览器内核框架中的cef框架更新到新版本,以及最近对于cef内核的理解。
1、cef简介和下载编译
CEF全称是Chromium Embedded Framework,它是Chromium的Content API的封装库。
CEF官网地址:https://bitbucket.org/chromiumembedded/cef
CEF官方论坛:http://www.magpcss.org/ceforum
CEFSharp:https://github.com/cefsharp/CefSharp
ChromiumFX,.NET bindings for the Chromium Embedded Framework.: https://bitbucket.org/chromiumfx/chromiumfx
其中我是在这个地址下载的:https://cef-builds.spotifycdn.com/index.html#windows32
下载的版本:05/26/2016 - 3.2704.1414.g185cd6c / Chromium 51.0.2704.47STABLE,下载地址:https://cef-builds.spotifycdn.com/cef_binary_3.2704.1414.g185cd6c_windows32.tar.bz2。
Google Code上倒是可以下载,但是是老的版本,2012年的: Google Code chromiu
membedded
但是好处是有vs2005、vs2008、vs2010版本的sln,不需要使用CMake转换。
下载好完整目录结构如下:
其中包括了CMakeLists.txt,其中使用低版本vs例如vs2008还要额外增加一个stdint.h就可以。
其中使用cmake配置编译完成如下结构:
例如这个cefclient工程运行出来cefclient.exe。
2、嵌入到工程框架中遇到的问题
当关闭相关浏览器时候碰到调用这个接口崩溃现象:
bool CefV8ValueCToCpp::GetKeys(std::vector<CefString>& keys) {
cef_v8value_t* _struct = GetStruct();
if (CEF_MEMBER_MISSING(_struct, get_keys))
return false;
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
// Translate param: keys; type: string_vec_byref
cef_string_list_t keysList = cef_string_list_alloc();
DCHECK(keysList);
if (keysList)
transfer_string_list_contents(keys, keysList);
// Execute
int _retval = _struct->get_keys(_struct,
keysList);
// Restore param:keys; type: string_vec_byref
if (keysList) {
keys.clear();
transfer_string_list_contents(keysList, keys);
cef_string_list_free(keysList);
}
// Return type: bool
return _retval?true:false;
}
首先打开微博三方接入url如下:
跳转到密码登录界面:
这个时候点击右上角关闭导致析构时间调用GetKey接口出现问题,先注释就可以。这个问题得后续继续排查。
3、VisualStudio2017、2019编译
VisualStudio2017、2019编译非常快速,使用CMake对cef_binary_3.3578.1860.g36610bd_windows32创建build项目,创建成功后只编译libcef_dll_wrapper即可,其他lib和资源使用编译好的即可。
2021年3月3日,以下载 cef_binary_88.2.9+g5c8711a+chromium-88.0.4324.182_windows32_minimal 为例,使用CMake-gui转换,默认是64位版本(如果需要使用32位版本,转换的时候注意选择Win32),转换后的vs工程默认就是Unicode字符集MTd(MT)的,直接编译libcef_dll_wrapper即可,生成的lib拷走,其他的lib直接使用现成的。
4、如何使用编译好的库以及相关动态文件
经测试主程序目录下须携带以下文件:
libcef.dll
chrome_elf.dll
icudtl.dat
v8_context_snapshot.bin
cef.pak
cef_extensions.pak
cef_200_percent.pak
cef_100_percent.pak
如果主程序运行仍然出错,可能就是资源文件没有配齐,可以再复制一些cef的资源文件进去试试。
5、注意
尽量链接release版本的,要链接:libcef.lib、cef_sandbox.lib、libcef_dll_wrapper
字符串要传递的时候,需转换为Unicode,可使用std::wstring转换,注意使用CStringW转换可能会有问题。
VisitDOM只能在render进程中使用,无法在browser进程中使用。
6、常见问题
cefinitialize崩溃:说明exe执行路径下缺少相关文件导致初始化失败,可以把Resources目录下的locales文件夹、icudtl.dat、cef*.pak等文件复制过来。
base::Bind not found:解决办法:修改为base::BindOnce,会提示找不到OnceCallback,需要在cef_bind.h头文件中添加对cef_callback.h文件的包含,这个太坑了。
7、cef的通信及同步调用JS
。。。。。