chrome 内核CEF 编译和qt 封装(下)
?上篇講述了如何編譯cef 成果物以及驗(yàn)證方法。 但在實(shí)際開發(fā)過程中需要對(duì)cef 關(guān)鍵庫進(jìn)行再次封裝,以便在項(xiàng)目開發(fā)過程中更加方便的使用此庫。本文結(jié)合qt 框架進(jìn)行此庫的封裝。
一、 CEF結(jié)構(gòu)介紹
1、?CEF主進(jìn)程和窗口之間的結(jié)構(gòu)關(guān)系
????????一個(gè)瀏覽器有很多個(gè)CefBrowser窗口,這些窗口都是在Browser進(jìn)程中創(chuàng)建。browser進(jìn)程用來管理和處理回調(diào)函數(shù)消息。Renderer進(jìn)程用來實(shí)現(xiàn)網(wǎng)頁的渲染,每個(gè)renderer進(jìn)程包含有一個(gè)主網(wǎng)頁mainframe和多個(gè)子網(wǎng)頁subframe。
2、Renderer進(jìn)程的實(shí)現(xiàn)結(jié)構(gòu)
renderer程序繼承CefApp和CefRenderProcessHandler類,在main函數(shù)中初始化。通過CefSettings.browser_subprocess_path配置render可執(zhí)行程序路徑。browser進(jìn)程就會(huì)去啟動(dòng)這個(gè)進(jìn)程去渲染網(wǎng)頁。
?3、browser進(jìn)程的實(shí)現(xiàn)結(jié)構(gòu)
browserapp要繼承CefApp和CefBrowserProcessHandler類。實(shí)現(xiàn)browserapp的定義。同時(shí)要新建clienthandler類實(shí)現(xiàn)圖中的回調(diào)函數(shù)接口類,用來處理攔截響應(yīng)請(qǐng)求、管理生命周期、下載、顯示加載、右鍵菜單等。在mian函數(shù)中初始化、啟動(dòng)消息循環(huán)。調(diào)用CefBrowserHost的靜態(tài)方法創(chuàng)建browser窗口對(duì)象,在render進(jìn)程的Frame中加載渲染內(nèi)容。
二、cef? 進(jìn)程開發(fā)模式
1、進(jìn)程
CEF3是多進(jìn)程架構(gòu)的,CEF3進(jìn)程主要有一個(gè)Browser(瀏覽器)進(jìn)程和多個(gè)Renderer(渲染)進(jìn)程。Browser被定義為主進(jìn)程,負(fù)責(zé)窗口管理,網(wǎng)絡(luò)請(qǐng)求,網(wǎng)頁管理 、網(wǎng)絡(luò)交互。browser從服務(wù)器器請(qǐng)求到了響應(yīng),將html文本發(fā)送給Renderer 進(jìn)程,render進(jìn)程加載html,進(jìn)行渲染,展示網(wǎng)頁的內(nèi)容;除此之外,Renderer進(jìn)程還負(fù)責(zé)Js Binding和對(duì)Dom節(jié)點(diǎn)的訪問。Browser和Renderer進(jìn)程可以通過發(fā)送異步消息進(jìn)行雙向通信。主應(yīng)用程序很大,加載時(shí)間比較長,或者不能在非瀏覽器進(jìn)程里使用,則宿主程序可使用獨(dú)立的可執(zhí)行文件去運(yùn)行這些Renderer進(jìn)程。這可以通過配置CefSettings.browser_subprocess_path變量做到。
2、 線程
Browser進(jìn)程中包含如下主要的線程:
- TID_UI?線程是瀏覽器的主線程。如果應(yīng)用程序在調(diào)用調(diào)用CefInitialize()時(shí),傳遞CefSettings.multi_threaded_message_loop=false,這個(gè)線程也是應(yīng)用程序的主線程。
- TID_IO?線程主要負(fù)責(zé)處理IPC消息以及網(wǎng)絡(luò)通信。
- TID_FILE?線程負(fù)責(zé)與文件系統(tǒng)交互。
每個(gè)CEF3應(yīng)用程序都是相同的結(jié)構(gòu)
- 提供入口函數(shù),用于初始化CEF、運(yùn)行子進(jìn)程執(zhí)行邏輯或者CEF消息循環(huán)。
- 提供CefApp實(shí)現(xiàn),用于處理進(jìn)程相關(guān)的回調(diào)。
- 提供CefClient實(shí)現(xiàn),用于處理Browser實(shí)例相關(guān)的回調(diào)。
- 執(zhí)行CefBrowserHost::CreateBrowser()創(chuàng)建一個(gè)Browser實(shí)例,使用CefLifeSpanHandler管理Browser對(duì)象生命周期。
- 需要在程序的入口函數(shù)執(zhí)行cef對(duì)象創(chuàng)建,初始化,命令行參數(shù)解析,CEF屬性設(shè)置,和CEF消息循環(huán)開啟等。CEF需要啟動(dòng)一個(gè)主進(jìn)程來管理網(wǎng)頁見面。這個(gè)主進(jìn)程就是在man函數(shù)中啟動(dòng),進(jìn)入消息循環(huán),直到程序結(jié)束,才退出main函數(shù)。
3.? ?CEF單實(shí)例進(jìn)程
????????demo里的單進(jìn)程例子?
單進(jìn)程開發(fā)模式:
?多進(jìn)程開發(fā)模式:
三、 qt 封裝
1、構(gòu)建qt? 主進(jìn)程 dll 工程。為了實(shí)現(xiàn)把cef 相關(guān)接口信息透傳到qt 主進(jìn)程里。
主進(jìn)程重寫cef 提供的類:
ClientHandler、 public CefApp
?
??
子進(jìn)程重寫cef 提供的類
?CefApp、CefRenderProcessHandler、CefV8Handler
?
2、核心原理:通過上層定義cef 提供的相關(guān)接口指針,并結(jié)合c++ 11 提供的std::function、std::bind 功能實(shí)現(xiàn)上層指針和底層指針綁定。通過此技術(shù)實(shí)現(xiàn)cef 底層接口參數(shù)能通過qt 信號(hào)槽機(jī)制發(fā)送到對(duì)應(yīng)的界面,通過功能函數(shù)模板 實(shí)現(xiàn)對(duì)cef? 底層相關(guān)的接口調(diào)用,最終達(dá)到預(yù)期目的,實(shí)現(xiàn)cef 層的qt 封裝。
?3.最后相關(guān)成果物
需要導(dǎo)出的頭文件如下:
?
?在工程屬性文件里配置頭文件和lib 庫路徑,然后根據(jù)程序的初始化流程創(chuàng)建cef 窗口,并把窗口插入到界面布局中,show 即可。
驗(yàn)證結(jié)果如下:
核心類的詳解參考:https://www.cnblogs.com/bclshuai/p/12722607.html
總結(jié)
以上是生活随笔為你收集整理的chrome 内核CEF 编译和qt 封装(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#委托实现C++ Dll中的回调函数
- 下一篇: 张正友相机标定Opencv实现以及标定流