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