- 1.介绍
- 2.入门
- 3.加载自定义 URL
- 4.应用模块
- 5.源代码
- 6.入口点函数
- 7.简单应用
- 8.简单处理程序
- 9.构建步骤
- 10.Windows 构建步骤
- 11.Linux 构建步骤
- 12.Mac OS X 构建步骤
- 13.作者答疑
本教程解释了如何使用 CEF3 创建一个简单的应用程序。它引用了cefsimple 示例项目。如需完整的 CEF3 使用信息,请访问GeneralUsage Wiki 页面。
2.入门CEF 提供了一个示例项目,可让您轻松开始 CEF 开发。只需浏览到cef-project网站并按照分步说明进行操作。本教程链接的源文件适用于当前的 CEF3 主分支,可能与 cef-project 下载的版本略有不同。
3.加载自定义 URLcefsimple 应用程序默认加载 zhiliaos.com,但您可以将其更改为加载自定义 URL。加载不同 URL 的最简单方法是通过命令行。这个项目是源代码项目下的展示项目:
# 加载本地文件“c:\example\example.html”
cefsimple.exe --url=file://c:/example/example.html
您还可以编辑cefsimple/simple_app.cc 中的源代码并重新编译应用程序以默认加载您的自定义 URL。
// 加载本地文件“c:\example\example.html”
...
if (url.empty())
url = "file://c:/example/example.html";
…
4.应用模块
所有 CEF 应用程序都具有以下主要组件:
- CEF 动态库(Windows 上的 libcef.dll,Linux 上的 libcef.so,OS X 上的“Chromium Embedded Framework.framework”)。
- 支持文件(*.pak 和 *.bin 二进制 blob 等)。
- 资源(用于内置功能、字符串等的 html/js/css)。
- 客户端可执行文件(本示例中为 cefsimple)。
CEF 动态库、支持文件和资源对于每个基于 CEF 的应用程序都是相同的。它们包含在二进制分发版的 Debug/Release 或 Resources 目录中。请参阅二进制分发版中包含的 README.txt 文件,详细了解哪些文件是必需的,哪些可以安全地省略。有关每个平台上所需应用程序布局的详细说明,请参见下文。
以下列表总结了本教程中最重要的模块信息:
- CEF 使用多个进程。主要的应用程序进程称为“浏览器”进程。将为渲染器、插件、GPU 等创建子进程。
- 在 Windows 和 Linux 上,相同的可执行文件可用于主进程和子进程。在 OS X 上,您需要为子进程创建单独的可执行文件和应用程序包。
- CEF 中的大多数进程都有多个线程。CEF 提供了用于在这些不同线程之间发布任务的函数和接口。
- 某些回调和函数可能仅用于特定进程或特定线程。在第一次开始使用新的回调或函数之前,请务必阅读 API 标头中的源代码注释。
cefsimple 应用程序初始化 CEF 并创建一个弹出式浏览器窗口。当所有浏览器窗口都关闭时,应用程序终止。程序流程如下:
- 操作系统执行浏览器进程入口点函数(main 或 wWinMain)。
- 入口点函数:创建处理进程级回调的 SimpleApp 实例。初始化 CEF 并运行 CEF 消息循环。
- 初始化后,CEF 调用 SimpleApp::OnContextInitialized()。这种方法:创建 SimpleHandler 的单例实例。使用 CefBrowserHost::CreateBrowser() 创建浏览器窗口。
- 所有浏览器共享 SimpleHandler 实例,该实例负责自定义浏览器行为和处理与浏览器相关的回调(生命周期、加载状态、标题显示等)。
- 当浏览器窗口关闭时,调用 SimpleHandler::OnBeforeClose()。当所有浏览器窗口都关闭时, OnBeforeClose 实现会退出 CEF 消息循环以退出应用程序。 您的二进制发行版可能包含以下文件的较新版本。但是,一般概念保持不变。
执行开始于浏览器进程入口点函数。该函数负责初始化 CEF 和任何与操作系统相关的对象。例如,它在 Linux 上安装 X11 错误处理程序并在 OS X 上分配必要的 Cocoa 对象。OS X 有一个单独的入口点函数用于辅助进程。
平台实现Windows平台实现cefsimple/cefsimple_win.ccLinux平台实现cefsimple/cefsimple_linux.ccMac OS X 平台实现对于浏览器进程:cefsimple/cefsimple_mac.mm对于子进程:cefsimple/process_helper_mac.cc 7.简单应用SimpleApp 负责处理进程级回调。它公开了一些由多个进程共享的接口/方法,以及一些仅在特定进程中调用的接口/方法。例如,CefBrowserProcessHandler 接口仅在浏览器进程中调用。有一个单独的 CefRenderProcessHandler 接口(在这个例子中没有显示),它只在渲染过程中被调用。注意 GetBrowserProcessHandler() 必须返回 |this| 因为 SimpleApp 实现了 CefApp 和 CefBrowserProcessHandler。有关CefApp 和相关接口的其他信息,请参阅GeneralUsage Wiki 页面或 API 头文件。共享实现:cefsimple/simple_app.h、cefsimple/simple_app.cc
8.简单处理程序SimpleHandler 负责处理浏览器级别的回调。这些回调在浏览器进程中执行。在此示例中,我们对所有浏览器使用相同的 CefClient 实例,但您的应用程序可以根据需要使用不同的 CefClient 实例。有关CefClient 和相关接口的其他信息,请参阅GeneralUsage Wiki 页面或 API 头文件。
- 共享实现:cefsimple/simple_handler.h、cefsimple/simple_handler.cc
- Windows平台实现:cefsimple/simple_handler_win.cc
- Linux平台实现:cefsimple/simple_handler_linux.cc
- Mac OS X 平台实现:cefsimple/simple_handler_mac.mm
构建步骤因平台而异。探索包含在二进制发行版中的 CMake 文件,以全面了解所有必需的步骤。所有平台通用的构建步骤一般可以总结如下:
- 编译 libcef_dll_wrapper 静态库。
- 编译应用程序源代码文件。链接 libcef 动态库和 libcef_dll_wrapper 静态库。
- 将库和资源复制到输出目录。
- 编译 libcef_dll_wrapper 静态库。
- 编译/链接 cefsimple.exe。
- 所需的源代码文件包括:cefsimple_win.cc、simple_app.cc、simple_handler.cc、simple_handler_win.cc。
- 所需的链接库包括:comctl32.lib、shlwapi.lib、rcprt4.lib、libcef_dll_wrapper.lib、libcef.lib、cef_sandbox.lib。请注意,cef_sandbox.lib(沙箱支持所需)是当前使用 Visual Studio 2015 Update 3 构建的静态库,它可能无法与其他 Visual Studio 版本一起编译。有关如何禁用沙箱支持,请参阅 cefsimple_win.cc 中的注释。
- 资源文件是cefsimple.rc。
- 清单文件是cefsimple.exe.manifest 和compatibility.manifest。
- 将所有文件从 Resources 目录复制到输出目录。
- 将所有文件从 Debug/Release 目录复制到输出目录。
- 编译 libcef_dll_wrapper 静态库。
- 编译/链接 cefsimple。
- 所需的源代码文件包括:cefsimple_linux.cc、simple_app.cc、simple_handler.cc、simple_handler_linux.cc。
- 所需的链接库包括:libcef_dll_wrapper.a、libcef.so 和依赖项(在构建时使用“pkg-config”工具确定)。
- 配置 rpath 以在当前目录中查找 libcef.so(“-Wl,-rpath,.”)或使用 LD_LIBRARY_PATH 环境变量。
- 将所有文件从 Resources 目录复制到输出目录。
- 将所有文件从 Debug/Release 目录复制到输出目录。 在 chrome-sandbox 可执行文件上设置 SUID 权限以支持沙箱。有关必要命令,请参阅二进制分发构建输出。
- 编译 libcef_dll_wrapper 静态库。
- 编译/链接/打包“cefsimple Helper”应用程序。
- 所需的源代码文件包括:process_helper_mac.cc。
- 所需的链接框架包括:AppKit.framework。
- 应用程序包配置通过“cefsimple/mac/helper-Info.plist”提供。
- 按此处所述加载 CEF 框架。
- 编译/链接/打包“cefsimple”应用程序。
- 所需的源代码文件包括:cefsimple_mac.mm、simple_app.cc、simple_handler.cc、simple_handler_mac.mm。
- 所需的链接框架包括:AppKit.framework。
- 应用程序包配置通过“cefsimple/mac/Info.plist”提供。
- 按此处所述加载 CEF 框架。
- 在 cefsimple.app 包中创建一个 Contents/Frameworks 目录。将以下文件复制到该目录:“cefsimple Helper.app”、“Chromium Embedded Framework.framework”。
如有疑问,请留言。