Chromium Embedded Framework (CEF)是基于Google Chromium项目的开源Web browser控件,支持Windows, Linux, Mac平台。 软件环境: Windows 10家庭版 Visual Studio 2019 CEF 83.3.11+g1fac1e5+chromium-83.0.4103.61 / Chromium 83.0.4103.61,这个版本的Debug与VS2017有些不兼容,只能使用Release方式编译。但在VS2019中均可编译通过。 “D:\MyProjectsVS.1\cef_binary_83.3.11\”为CEF工程目录
下载(http://opensource.spotify.com/cefbuilds/index.html#windows32_builds) cef_binary_83.3.11+g1fac1e5+chromium-83.0.4103.61_windows32.tar.bz2 如果需要调试信息,则还需要下载:(具体用法自行查找) cef_binary_83.3.11+g1fac1e5+chromium-83.0.4103.61_windows32_debug_symbols.tar.bz2 我使用的是32位版的
解压后使用CMake工具生成VS2019的工程,步骤如下:
选择好源和目的文件夹配置生成器为Visual Studio 16 2019生成目标环境使用VS2019打开工程编译工程,注意选择Win32平台Debug方式,完成后获得以下三个文件: D:\MyProjectsVS.1\cef_binary_83.3.11\Debug\ libcef.lib D:\MyProjectsVS.1\cef_binary_83.3.11\Debug\ libcef.dll D:\MyProjectsVS.1\cef_binary_83.3.11\libcef_dll_wrapper\Debug\libcef_dll_wrapper.lib
由于CEF是多进程内嵌,所以需要两个类class SimpleApp和class SimpleHandler,其中SimpleApp是用于在用户程序中创建内嵌CEF应用,而SimpleHandler是负责传递各种消息,这些消息是以虚函数的形式显现出来。SimpleHandler是继承于多个处理类,每增加一个处理类需要调用该类的GetDisplayHandler函数取得句柄,然后调用各种消息处理函数。
导入自己的工程需要四个文件(可改名),其中的产生的CefBrowser指针需由自己管理,官方例子中使用了std::list类型保存多个实例。 simple_app.cc simple_app.h simple_handler.cc simple_handler.h 另外还要将D:\MyProjectsVS.1\cef_binary_83.3.11\include目录复制到自己的工程。
在应用程序的CMyApp::InitInstance()中添加初始化代码:
CefMainArgs main_args(m_hInstance); CefRefPtr<SimpleApp> app(new SimpleApp); int exit_code = CefExecuteProcess(main_args, app.get(), NULL); if (exit_code >= 0) { exit(exit_code); } CefSettings settings; CefSettingsTraits::init(&settings); settings.no_sandbox = true; settings.multi_threaded_message_loop = true; CefInitialize(main_args, settings, app.get(), NULL);在相应的CWebView::OnCreate(LPCREATESTRUCT lpCreateStruct)中生成浏览器窗口
CefWindowInfo info; CefBrowserSettings settings; cef32_handler = new SimpleHandler(true); info.SetAsChild(m_hWnd, CRect(0, 0, 1000, 1000)); CefBrowserHost::CreateBrowser(info, cef32_handler, CefString("about:blank"), settings, nullptr, nullptr);在CWebView::OnSize(UINT nType, int cx, int cy)中控制大小适应窗口
if(cef32_handler.get() && cx > 0 && cy > 0) { CefRefPtr<CefBrowser>browser = cef32_handler->GetBrowser(); if(browser) { CefWindowHandle hWnd = browser->GetHost()->GetWindowHandle(); if(::IsWindow(m_hWnd)) ::MoveWindow(hWnd, 0, 0, cx, cy, true); } }在CMyApp::ExitInstance()中退出CEF
CefQuitMessageLoop(); CefShutdown();Debug版本使用CefShutdown()会在debug.log中产生错误报告,Release发行版会忽略。
运行时所需的文件如下:
文件名类型说明localesfolder本地化资源。CefSettings.locale指定需要加载的pak文件,只需要发布配置的区域对应的pak文件cef.pakfile这些文件包含了供CEF使用的区域无关资源,缺少这些文件任意Web组件可能显示不正确cef_100_percent.pakfile同上cef_200_percent.pakfile同上cef_extensions.pakfile此文件包含扩展加载所需的非本地化资源传递--disable-extensions命令行标志来禁止使用文件。没有这个文件,依赖于扩展系统的组件将不起作用, 如PDF查看器chrome_elf.dllfileCrash reporting library,崩溃报告d3dcompiler_43.dll 或 d3dcompiler_47.dllfileWindows XP/Vista和更高版本的系统需要该文件devtools_resources.pakfile此文件包含Chrome开发者工具所需的非本地化资源,缺少这个文件,Chrome开发者工具将无法运行icudtl.datfile用来支持unicode,缺少这些文件虽然编译能通过,但是执行CefInitialize();的时候就会崩溃libcef.dllfile核心库,要区分Debug和ReleaselibEGL.dllfileDirect3D支持文件,如果缺少这些文件,HTML5在渲染2D画布,3D CSS,WebGL时将不起作用libGLESv2.dllfile同上snapshot_blob.binfileV8引擎快照数据v8_context_snapshot.binfile同上注:V8引擎是一种JavaScript运行引擎,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序在V8引擎下的运行速度媲美二进制程序。