一.CEF簡(jiǎn)介
Chromium Embedded Framework (CEF)是個(gè)基于Google Chromium項(xiàng)目的開(kāi)源Web browser控件,支持Windows, Linux, Mac平臺(tái)。
簡(jiǎn)單說(shuō)就是Chrome的開(kāi)源版,目前很多所謂的雙核瀏覽器,實(shí)質(zhì)就是chrome+IE的雙核?;贖TML5的支持,以及v8引擎的效率,在軟
件中嵌入chromium是個(gè)不錯(cuò)的選擇,而且目前市面上應(yīng)用及其廣泛,如:tx系軟件。spy++一抓就知道了,如下圖
二.cef下載
http://opensource.spotify.com/cefbuilds/index.html下載速度是不快,但總算下載下來(lái)了,由于本人是vs2013,遇到的坑就是3.3以上的版本至少要vs2015以上才
能編譯,總之搞了很久最后下了一個(gè)3.27版本才成功,提示:如果不打算放棄32位就建議下載32位版本吧,不然64位軟件在32位系統(tǒng)是跑不起來(lái)的。
由于新下載的標(biāo)準(zhǔn)開(kāi)發(fā)包解壓就是如下圖了,
文件目錄結(jié)構(gòu)在此做下說(shuō)明,很是重要。筆者在此花費(fèi)了很多時(shí)間。
1.首先建議先閱讀Readme.txt,該文件對(duì)項(xiàng)目結(jié)構(gòu)做了簡(jiǎn)要說(shuō)明。當(dāng)然看一遍肯定不可能完全理解。但隨著對(duì)項(xiàng)目的熟悉了解,
發(fā)現(xiàn)該文件說(shuō)的還是挺清晰的。
2.licence.txt沒(méi)啥說(shuō)的,就是關(guān)于版權(quán)的說(shuō)明。
幾個(gè)gyp/gypi文件是不能手動(dòng)修改的,是GYP(Generate Your Projects)工具自動(dòng)生成的相當(dāng)于工程配置文件。插入一段GYP說(shuō)明:
GYP結(jié)構(gòu)
GYP的輸入是.gyp和.gypi文件,.gypi文件是用于.gyp文件include使用的。.gyp文件就是符合特定格式的json文件。
gyp文件中包含target,Visual C++下,gyp生成sln,target生成vcproj或vxcproj。
chromium中GYP結(jié)構(gòu)是,通過(guò)命令行統(tǒng)一使用build/common.gypi的公共文件,工程的配置,選項(xiàng)的處理,編譯選項(xiàng)的使用,都是在這個(gè)文件中配置。
GYP結(jié)構(gòu)GYP的輸入是.gyp和.gypi文件,.gypi文件是用于.gyp文件include使用的。.gyp文件就是符合特定格式的json文件。gyp文件中包含target,Visual C++下,gyp生成sln,target生成vcproj或vxcproj。chromium中GYP結(jié)構(gòu)是,通過(guò)命令行統(tǒng)一使用build/common.gypi的公共文件,工程的配置,選項(xiàng)的處理,編譯選項(xiàng)的使用,都是在這個(gè)文件中配置。
生成一個(gè)總工程all.gyp,這個(gè)工程依賴(lài)于其他所有的工程,這個(gè)工程生成,所有工程都生成完成。而且有一個(gè)總工程也方便開(kāi)發(fā)。
如果要使用GYP,建議依照chromium的結(jié)構(gòu),common.gypi也用chromium的進(jìn)行裁剪,畢竟各種選項(xiàng)的選擇也是需要經(jīng)驗(yàn)的。
生成一個(gè)總工程all.gyp,這個(gè)工程依賴(lài)于其他所有的工程,這個(gè)工程生成,所有工程都生成完成。而且有一個(gè)總工程也方便開(kāi)發(fā)。如果要使用GYP,建議依照chromium的結(jié)構(gòu),common.gypi也用chromium的進(jìn)行裁剪,畢竟各種選項(xiàng)的選擇也是需要經(jīng)驗(yàn)的。
使用GYP
chromium工程中的方法是使用build/gyp_chromium這個(gè)Python腳本來(lái)調(diào)用,這個(gè)腳本實(shí)現(xiàn)添加公共配置,偵測(cè)附加配置,添加需要的編譯選項(xiàng)。
使用GYPchromium工程中的方法是使用build/gyp_chromium這個(gè)Python腳本來(lái)調(diào)用,這個(gè)腳本實(shí)現(xiàn)添加公共配置,偵測(cè)附加配置,添加需要的編譯選項(xiàng)。
CMake是一個(gè)跨平臺(tái)的安裝(編譯)工具,可以用簡(jiǎn)單的語(yǔ)句來(lái)描述所有平臺(tái)的安裝(目前很多開(kāi)源跨平臺(tái)庫(kù)都使用此方式如:ProtoBuf,cef)。
CMake腳本本文不做介紹,由于當(dāng)前用的win平臺(tái)所以直接下載免安裝版解壓運(yùn)行cmake-gui.exe,(說(shuō)句廢話,這是一個(gè)qt程序,
跨平臺(tái)還是選擇了qt,呵呵)。
需要注意的就是源代碼目錄和生成工程文件的目錄了,configue沒(méi)錯(cuò)誤就Generate生成相應(yīng)vs版本工程文件,然后OpenProject,
libcef_dll_wrapper會(huì)生成一個(gè)庫(kù),cefclient和cefsimple則會(huì)生成測(cè)試程序,對(duì)應(yīng)下面兩張圖。
4.文件夾介紹
(1)cmake,該文件夾包含Cmake的一些宏定義,配置信息。
(2)include,使用該庫(kù)的所有頭文件
(3)libcef_dll,庫(kù)的源代碼
(4)tests,測(cè)試程序demo源代碼
(5)Resource,資源文件
該資源文件是程序運(yùn)行需要依賴(lài)的資源文件,含語(yǔ)言包,unicode支持等
(6)Debug/Release,程序依賴(lài)的動(dòng)態(tài)庫(kù)/靜態(tài)庫(kù)。但不包括C++庫(kù):libcef_dll_wrapper.lib。
1、必須文件,缺少任意一個(gè)CEF將無(wú)法運(yùn)行:
libcef.dll
這個(gè)不用多說(shuō),CEF的核心庫(kù)文件,js引擎、網(wǎng)頁(yè)加載渲染邏輯等都在其中,也是size最大的一個(gè)文件(Release版將近50M,Debug版超過(guò)500M)。
icudtl.dat
用來(lái)支持unicode,缺少這些文件雖然編譯能通過(guò),但是執(zhí)行CefInitialize();的時(shí)候就會(huì)崩潰,在這個(gè)坑趴了很久還以為是代碼問(wèn)題。
natives_blob.bin
snapshot_blob.bin
V8引擎快照數(shù)據(jù)。
2、可選文件:
locales/
該目錄包含CEF,Chromium和Blink使用的本地化資源。 CefSettings.locale指定需要加載的.pak文件。 只需要發(fā)布配置的區(qū)域?qū)?yīng)的.pak文件。
如果沒(méi)有區(qū)域設(shè)置將配置默認(rèn)語(yǔ)言環(huán)境“en-US”。如果沒(méi)有這些文件任意Web組件可能顯示不正確。
cef.pak
cef_100_percent.pak
cef_200_percent.pak
這些文件包含了供CEF使用的區(qū)域無(wú)關(guān)資源,缺少這些文件任意Web組件可能顯示不正確。(筆者當(dāng)時(shí)缺少cef_100_percent.pak,
cef_200_percent.pak兩文件,導(dǎo)致視頻控件不顯示音量和最大化按鈕)。
cef_extensions.pak
此文件包含擴(kuò)展加載所需的非本地化資源傳遞`–disable-extensions`命令行標(biāo)志來(lái)禁止使用文件。沒(méi)有這個(gè)文件,依賴(lài)于擴(kuò)展系統(tǒng)的組件將不起作用,
如PDF查看器。
devtools_resources.pak
此文件包含Chrome開(kāi)發(fā)者工具所需的非本地化資源,缺少這個(gè)文件,Chrome開(kāi)發(fā)者工具將無(wú)法運(yùn)行。
d3dcompiler_43.dll (Windows XP需要該文件)
d3dcompiler_47.dll (Windows Vista和更高版本的系統(tǒng)需要該文件)
libEGL.dll
libGLESv2.dll
Direct3D支持文件,如果缺少這些文件,HTML5在渲染2D畫(huà)布,3D CSS,WebGL時(shí)將不起作用。
wow_helper.exe
用來(lái)支持Windows Vista 64位沙箱。如果沒(méi)有這個(gè)文件,32位的CEF將無(wú)法在開(kāi)啟了沙箱的64位的Vista機(jī)器上運(yùn)行。
附MFC使用CEF3簡(jiǎn)單Demo代碼
BOOL CMFCDlgCefTestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加額外的初始化代碼
CefRefPtr<CSimpleClient> client(new CSimpleClient());
m_simpleClient = client;
CefSettings settings;
CefSettingsTraits::init(&settings);
settings.multi_threaded_message_loop = true;
CefMainArgs mainArgs;
CefRefPtr<CefApp> cefApp;
CefInitialize(mainArgs, settings, cefApp, NULL);
RECT rect;
GetClientRect(&rect);
RECT rectnew = rect;
CefWindowInfo winInfo;
winInfo.SetAsChild(GetSafeHwnd(), rectnew);
CefBrowserSettings browserSettings;
CefBrowserHost::CreateBrowser(winInfo, client, _T(”http://www.lofter.com”), browserSettings, NULL);
return TRUE; // 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUE
}
BOOL CMFCDlgCefTestDlg::OnInitDialog(){ CDialogEx::OnInitDialog(); // TODO: 在此添加額外的初始化代碼 CefRefPtr<CSimpleClient> client(new CSimpleClient()); m_simpleClient = client; CefSettings settings; CefSettingsTraits::init(&settings); settings.multi_threaded_message_loop = true; CefMainArgs mainArgs; CefRefPtr<CefApp> cefApp; CefInitialize(mainArgs, settings, cefApp, NULL); RECT rect; GetClientRect(&rect); RECT rectnew = rect; CefWindowInfo winInfo; winInfo.SetAsChild(GetSafeHwnd(), rectnew); CefBrowserSettings browserSettings; CefBrowserHost::CreateBrowser(winInfo, client, _T("http://www.lofter.com"), browserSettings, NULL); return TRUE; // 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUE}
void CMFCDlgCefTestDlg::OnClose()
{
<span style=”white-space:pre;”> </span>// TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值
<span style=”white-space:pre;”> </span>m_simpleClient->Release();
<span style=”white-space:pre;”> </span>CefShutdown();<span style=“color:#ff0000;”>//其實(shí)這行代碼如果沒(méi)有設(shè)置cefApp的話,是會(huì)崩潰的,測(cè)試完全可以注釋。但切記,該函數(shù)只能在主線程中調(diào)用。后續(xù)深入學(xué)習(xí)后,還需解一下惑</span>
<span style=”white-space:pre;”> </span>CDialogEx::OnClose();
}
void CMFCDlgCefTestDlg::OnClose(){ // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值 m_simpleClient->Release(); CefShutdown();//其實(shí)這行代碼如果沒(méi)有設(shè)置cefApp的話,是會(huì)崩潰的,測(cè)試完全可以注釋。但切記,該函數(shù)只能在主線程中調(diào)用。后續(xù)深入學(xué)習(xí)后,還需解一下惑 CDialogEx::OnClose();}
聯(lián)系客服