CEF GeneralUsage
简介
Chromium Embedded FrameWork(CEF) 是一个基于 Chromium 的开源项目。它与 Chromium 的不同之处在于,Chromium 项目服务于 Chrome 浏览器;而 CEF 则是为第三方程序提供嵌入式浏览器框架。CEF 适用的场合有:
- 在已有的本地程序中嵌入 支持 HTML5 的浏览器控件;
- 创建一个轻量级的 "壳"程序,在此基础上可以使用 Web 技术来进行 UI 开发;
- "离屏渲染", 例如在后台加载一个很大的网页,然后直接展示它,避免页面在前台加载很长时间;
CEF3 是 CEF 的最新版本,它基于 Chromium Content API 。
本文介绍了使用 CEF3 进行程序开发时所涉及的常见概念。
开始
二进制版本
要体验 CEF,可以先从 这个页面 下载二进制版本。下载完成后解压,有以下几个目录:
- cefclient : 包含了一个基于二进制 CEF 库开发的示例程序 cefclient。这个程序使用了 CEF 的大部分功能;
- cefsimple : 包含了一个基于二进制 CEF 库开发的示例程序 cefsimple。这个程序只是使用 CEF 创建了一个浏览器窗口;
- include : CEF 头文件;
- Debug/Release : 编译好的 CEF 共享库 libcef.dll 及其他必要的共享库;
-
libcef_dll : 包含了用于生成
libcef_dll_wrapper.lib
静态库的代码。使用了 CEF C++ API 的程序必须链接这个静态库。关于 "C++ Wrapper" 的内容会在以后的章节介绍; - Resources : 资源文件夹。基于 CEF 开发的程序需要这些资源文件才能运行;
二进制版本需要编译才能生成 cefclient.exe 和 cefsimple.exe, 编译方法参考 Tutorial,或者直接查看根目录的 CMakeList.txt 文件。
源代码版本
也可以直接编译 CEF 源码。编译方法参考 BranchesAndBuilding。
重要概念
正式开始之前,有几个关于 CEF 的重要概念要先了解一下:
C++ Wrapper
libcef.dll 共享库导出的是 C API。对于需要使用 C++ API 的程序来说,就需要使用 libcef_dll_wrapper
项目来做封装。它会将 C API 封装成 C++ API,然后将 API 链接到客户端程序中。C/C++ API 之间的转换层代码是由 translator 工具自动完成的。
当然,直接使用 C API 也是可以的,具体内容请参考 UsingTheCAPI
进程
CEF3 以多进程的形式运行。主进程(也被叫做 "browser" 进程)负责处理窗口创建、绘制、网络访问等操作,另外宿主程序的业务逻辑也运行在 browser 进程中;Blink 渲染、JavaScript 脚本执行由另一种 "render" 进程负责,默认的 进程模型 会为每个站点创建一个 "render" 进程;其他类型的进程只在需要时创建,比如 "plugin" 进程用于运行插件(比如 Flash);"gpu" 进程用于处理 accelerated compositing。
默认情况下,主程序的可执行文件会被多次调用,创建出多个独立的进程,有的是 "browser" 进程,有的是 "render" 进程。程序通过命令行来区分自身代表的是哪种进程,进而执行对应进程的操作。如果可执行文件很大、加载很慢,也可以让 非"browser"进程 通过另一个独立的可执行文件来创建。这种配置需要在 CefSettings.browser_subprocess_path variable
里进行设定,更多信息请参考接下来的 "Application Structure" 章节。
各个进程可以使用 Inter-Process Communication(进程间通信) 机制来交互。browser 和 render 进程里的程序逻辑,通过发送异步消息的方式来通信。