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 進程里的程序邏輯,通過發送異步消息的方式來通信。