CEF GeneralUsage
簡介
Chromium Embedded FrameWork(CEF) 是一個基于 Chromium 的開源項目絮记。它與 Chromium 的不同之處在于拭荤,Chromium 項目服務于 Chrome 瀏覽器;而 CEF 則是為第三方程序提供嵌入式瀏覽器框架。CEF 適用的場合有:
- 在已有的本地程序中嵌入 支持 HTML5 的瀏覽器控件肴楷;
- 創(chuàng)建一個輕量級的 "殼"程序鸟妙,在此基礎上可以使用 Web 技術來進行 UI 開發(fā);
- "離屏渲染", 例如在后臺加載一個很大的網(wǎng)頁奶甘,然后直接展示它篷店,避免頁面在前臺加載很長時間;
CEF3 是 CEF 的最新版本臭家,它基于 Chromium Content API 疲陕。
本文介紹了使用 CEF3 進行程序開發(fā)時所涉及的常見概念。
開始
二進制版本
要體驗 CEF钉赁,可以先從 這個頁面 下載二進制版本蹄殃。下載完成后解壓,有以下幾個目錄:
- cefclient : 包含了一個基于二進制 CEF 庫開發(fā)的示例程序 cefclient你踩。這個程序使用了 CEF 的大部分功能诅岩;
- cefsimple : 包含了一個基于二進制 CEF 庫開發(fā)的示例程序 cefsimple讳苦。這個程序只是使用 CEF 創(chuàng)建了一個瀏覽器窗口;
- include : CEF 頭文件按厘;
- Debug/Release : 編譯好的 CEF 共享庫 libcef.dll 及其他必要的共享庫医吊;
-
libcef_dll : 包含了用于生成
libcef_dll_wrapper.lib
靜態(tài)庫的代碼。使用了 CEF C++ API 的程序必須鏈接這個靜態(tài)庫逮京。關于 "C++ Wrapper" 的內(nèi)容會在以后的章節(jié)介紹卿堂; - Resources : 資源文件夾±撩蓿基于 CEF 開發(fā)的程序需要這些資源文件才能運行草描;
二進制版本需要編譯才能生成 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 之間的轉(zhuǎn)換層代碼是由 translator 工具自動完成的寿酌。
當然胰苏,直接使用 C API 也是可以的,具體內(nèi)容請參考 UsingTheCAPI
進程
CEF3 以多進程的形式運行醇疼。主進程(也被叫做 "browser" 進程)負責處理窗口創(chuàng)建硕并、繪制、網(wǎng)絡訪問等操作秧荆,另外宿主程序的業(yè)務邏輯也運行在 browser 進程中倔毙;Blink 渲染、JavaScript 腳本執(zhí)行由另一種 "render" 進程負責乙濒,默認的 進程模型 會為每個站點創(chuàng)建一個 "render" 進程普监;其他類型的進程只在需要時創(chuàng)建,比如 "plugin" 進程用于運行插件(比如 Flash)琉兜;"gpu" 進程用于處理 accelerated compositing。
默認情況下毙玻,主程序的可執(zhí)行文件會被多次調(diào)用豌蟋,創(chuàng)建出多個獨立的進程,有的是 "browser" 進程桑滩,有的是 "render" 進程梧疲。程序通過命令行來區(qū)分自身代表的是哪種進程允睹,進而執(zhí)行對應進程的操作。如果可執(zhí)行文件很大幌氮、加載很慢缭受,也可以讓 非"browser"進程 通過另一個獨立的可執(zhí)行文件來創(chuàng)建。這種配置需要在 CefSettings.browser_subprocess_path variable
里進行設定该互,更多信息請參考接下來的 "Application Structure" 章節(jié)米者。
各個進程可以使用 Inter-Process Communication(進程間通信) 機制來交互。browser 和 render 進程里的程序邏輯宇智,通過發(fā)送異步消息的方式來通信蔓搞。