MFC內嵌cef3瀏覽器核心
一、cef3核心的下載
可以從http://opensource.spotify.com/cefbuilds/index.html下載,注意:很多版本編譯都可以通過 但是執行的時候會崩潰,以cef_binary_3.2704.1414.g185cd6c_windows32為例,該版本debug編譯都可以通過,執行的時候載入本地網頁會出現錯誤,原因未知,載入www.baidu.com,關閉的時候會出現崩潰的情況,release版本完全正常,
二、使用cmake建立成vs工程
本文建立為vs2015,
開啟vs工程檔案,,編譯libcef_all_wrapper,另外編譯自帶cefsimple,從libcef_dll_wrapper檔案下的生成目錄debug或者release獲取libcef_dll_wrapper.lib,另外要把cefsimple需要的依賴都拷出來,後面作為我們demo必要的依賴。
三、cef相關資料夾介紹
資料夾介紹
(1)cmake,該資料夾包含Cmake的一些巨集定義,配置資訊。
(2)include,使用該庫的所有標頭檔案
(3)libcef_dll,庫的原始碼
(4)tests,測試程式demo原始碼
(5)Resource,資原始檔
該資原始檔是程式執行需要依賴的資原始檔,含語言包,unicode支援等
(6)Debug/Release,程式依賴的動態庫/靜態庫。但不包括C++庫:libcef_dll_wrapper.lib。
1、必須檔案,缺少任意一個CEF將無法執行:
libcef.dll
這個不用多說,CEF的核心庫檔案,js引擎、網頁載入渲染邏輯等都在其中,也是size最大的一個檔案(Release版將近50M,Debug版超過500M)。
icudtl.dat
用來支援unicode,缺少這些檔案雖然編譯能通過,但是執行CefInitialize();的時候就會崩潰,在這個坑趴了很久還以為是程式碼問題。
natives_blob.bin
snapshot_blob.bin
V8引擎快照資料。
2、可選檔案:
locales/
該目錄包含CEF,Chromium和Blink使用的本地化資源。 CefSettings.locale指定需要載入的.pak檔案。 只需要釋出配置的區域對應的.pak檔案。
如果沒有區域設定將配置預設語言環境“en-US”。如果沒有這些檔案任意Web元件可能顯示不正確。
cef.pak
cef_100_percent.pak
cef_200_percent.pak
這些檔案包含了供CEF使用的區域無關資源,缺少這些檔案任意Web元件可能顯示不正確。(筆者當時缺少cef_100_percent.pak,
cef_200_percent.pak兩檔案,導致視訊控制元件不顯示音量和最大化按鈕)。
cef_extensions.pak
此檔案包含擴充套件載入所需的非本地化資源傳遞`--disable-extensions`命令列標誌來禁止使用檔案。沒有這個檔案,依賴於擴充套件系統的元件將不起作用,如PDF檢視器。
devtools_resources.pak
此檔案包含Chrome開發者工具所需的非本地化資源,缺少這個檔案,Chrome開發者工具將無法執行。
d3dcompiler_43.dll (Windows XP需要該檔案)
d3dcompiler_47.dll (Windows Vista和更高版本的系統需要該檔案)
libEGL.dll
libGLESv2.dll
Direct3D支援檔案,如果缺少這些檔案,HTML5在渲染2D畫布,3D CSS,WebGL時將不起作用。
wow_helper.exe
用來支援Windows Vista 64位沙箱。如果沒有這個檔案,32位的CEF將無法在開啟了沙箱的64位的Vista機器上執行。
四、測試demo的建立
1、建立mfc對話方塊工程,將cef_sandbox.lib、libcef.lib、libcef_dll_wrapper.lib拷到專案中,並新增相應依賴,將原始碼中的include資料夾新增到專案中。
2、將本人上傳的的檔案資源http://download.csdn.net/download/venice0708/10272163下載並新增到工程中,作為後面c++呼叫js和JS呼叫c++的依賴。
3、建立CTestWeb繼承IWebEventCallBackBase。
4、在BOOL CnewCef3DemoDlg::OnInitDialog(),新增
關閉的時候需要呼叫GetCefInstance()->ExitInstance();
五、c++呼叫js
在本人的依賴中有 GetCefInstance()->RunJS(pTestWeb->GetWebID(), L"sendMessage", 1, JsDataStr.GetBuffer());
第一個引數為該網頁的ID號,第二個為js的函式名,第三個為總的引數個數,第四個為引數,詳情請看原始碼。
六、JS呼叫c++
在上文的依賴程式碼中需要進行c++函式的註冊
在js程式碼中只需要CallWkeWebkit("CCjsCallCpp", "666");即可,詳細的可以參照一些網友的做法。
本文只要是寫了一些專案中研究的大體思路,方便以後查閱,類似的博文網上很多,詳細可以參考其他網友的!