CEF完整嵌入DUI窗體(二) –在程式中初始化Cef

CEF完整嵌入DUI窗體(二) –在程式中初始化Cef

從那裡下載Cef3的資源?
Cef3的各個版本下載地址:https://bitbucket.org/chromiumembedded/cef。這個地址不用翻牆就可以下載,但都是最近的版本,老版本的下載地址已經找不到了… 最後一個支援windowsXP的版本是3.2623,我用的也是這個版本。下載地址在這裡:http://pan.baidu.com/s/1jIgLoaU。 debug版本的資源有七百多兆,需要的朋友可以聯絡我。
怎麼在windows上編譯cef3?
下載一個Cmake工具即可輕鬆生成sln檔案,開啟編譯即可,可能會報錯編譯不通過,將警告視為錯誤選項修改為 否即可,這裡預設是將警告視為錯誤的;
開啟解決方案資源管理器如圖所示:
這裡寫圖片描述
libcef_dll_wrapper 是在講libcef的C介面做了一個C 的封裝,我們呼叫的時候使用的將是libcef_dll_wrapper的C 介面,cefsimple是cef3嵌入到MFC的一個簡單例項,cefclient則是一個全面的Cef3的功能實現,我們自己開發功能的時候也多是參照這個工程來改,但更具體的實現還是需要自己動手。關於怎麼在windows上配置Cef3的這個工程,網上的資料多如牛毛,我這裡就不再累贅了。我這裡裡主要講解如何將Cef3內嵌瀏覽器的功能封裝成一個Duilib的瀏覽器空間來使用,實現了有關介面回撥到最上層應用,C 和瀏覽器的js相互呼叫等功能,具體如何,各位看官長眼:
想在自己的工程中新增Cef瀏覽器,首先要在程式入口處呼叫Cef的初始化操作,我們將這個介面封裝到靜態函式中,以保證在main函式中就能呼叫到;

//高DPI支援  
CefEnableHighDPISupport();  
//沒有實現沙箱  
void* sandbox_info = NULL;   
CefMainArgs main_args(hInstance);   
CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine();   
command_line->InitFromString(::GetCommandLineW());   
if (!PathIsDirectory(cache_path.ToWString().c_str())) {   
SHCreateDirectory(NULL, cache_path.ToWString().c_str());   
}  
if (!PathIsDirectory(log_file.ToWString().c_str())) {   
SHCreateDirectory(NULL, log_file.ToWString().c_str());   
}  
//不同程序建立不同的app  
CefRefPtr<CefApp> app; reeiss_cef::ProcessType process_type = ClientApp::GetProcessType(command_line);   
if (process_type == reeiss_cef::BrowserProcess) {  
app = new ClientAppBrowser();  
}  
else {  
return false;  
}  
//這裡是對Cef的一些全域性設定  
CefSettings settings; CefSettingsTraits::init(&settings);  
//這個設定能實現單程序執行Cef瀏覽器外掛,我們實際應用中採用的是雙程序模式,即一個主程序,一個render渲染程序  
//settings.single_process = true;settings.no_sandbox = true;  
//設定渲染程序的名稱,因為在相同目錄下,沒有指定路徑  
CefString(&settings.browser_subprocess_path).FromWString(L"Render.exe");  
//禁用Cef的訊息迴圈,採用DuiLib的訊息迴圈  
settings.multi_threaded_message_loop = true;  
//設定本地語言  
CefString(&settings.locale).FromWString(L"zh-CN");  
//快取資料路徑  
CefString(&settings.cache_path).FromWString(cache_path);  
//debug日誌路徑  
CefString(&settings.log_file).FromWString(log_file);  
//初始化cef的全域性操作  
CefInitialize(main_args, settings, app.get(), sandbox_info);  
return true;  

當程式結束執行時,需要呼叫CefShutdown();介面來釋放資源,如果沒有呼叫這個的話,可能會出現程序假死的狀態,將這兩個介面放在一起,在main函式開始時呼叫初始化,在結束處呼叫關閉,即可安全的在程式中建立瀏覽器控制元件了。