cef运行框架_1.CEF(Chromium Embedded Framework)介绍-下载编译框架概念

CEF(Chromium Embedded Framework)是一个基于Google Chromium的开源项目,用于在客户端应用中嵌入浏览器界面。本文介绍了CEF的作用、下载和编译过程,详细讲解了CEF的结构,包括进程和窗口的关系、Renderer和Browser进程的实现以及多进程多线程模型。此外,还探讨了CEF在实际应用中的代码构成和实例,包括CefBrowser、CefBrowserHost、CefFrame等关键类的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 前言

1.1 CEF的作用

1.2 CEF的下载和编译

1.3 CEF结构

1.3.1 CEF进程和窗口之间的结构关系

1.3.2 Renderer进程的实现结构

1.3.3 browser进程的实现结构

1.4 CEF多进程和多线程

1.4.1 进程

1.4.2 线程

1.5 网页嵌入应用程序结构

1.5.1 入口函数

1.5.2 CEF单实例进程

1.5.3 主子进程的模式

1.6 CefBrowser 浏览器窗口类

1.7 CefBrowserHost浏览器操作控制类

1.8 CefFrame网页界面类

1.9 CefApp应用程序类

1.10 CEF引用计数

1.11 CEF自定义字符串

1.11.1 为什么自定义字符串类型

1.11.2 字符串操作函数CefString

1.11.3 CEF与String的转换

前言

1.1 CEF的作用

CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目。Google Chromium项目主要是为Google Chrome应用开发的,而CEF的目标则是为第三方应用提供可嵌入浏览器支持。CEF作用是在客户端嵌入网页界面。

  • 嵌入一个兼容HTML5的浏览器控件到一个已经存在的本地应用。
  • 创建一个轻量化的壳浏览器,用以托管主要用Web技术开发的应用。
  • 有些应用有独立的绘制框架,使用CEF对Web内容做离线渲染。
  • 使用CEF做自动化Web测试。

1.2 CEF的下载和编译

https://blog.youkuaiyun.com/csdnyonghu123/article/details/87982333

60632c62cb567f00da488cd7a15d7b9c.png

如图所示,CefClient工程是一个简单版的网页浏览器demo,有网址输入、前进后退等。

CefSimple更简单的网页工程,网址在代码设置,打开 直接渲染网页。

CefTest测试工程。

AllBuild是一个伪工程,用来执行编译其他工程。

libcef_dll_wrapper是cef的动态库工程,。

include是头文件

Release文件夹包含输出的库文件和依赖库文件,自己开发项目时将include和release文件复制到工程即可。参考CefSimple和CefClient代码实例。

1.3 CEF结构

1.3.1 CEF进程和窗口之间的结构关系

一个浏览器有很多个CefBrowser窗口,这些窗口都是在Browser进程中创建。browser进程用来管理和处理回调函数消息。

Renderer进程用来实现网页的渲染,每个renderer进程包含有一个主网页mainframe和多个子网页subframe,。

e7fb343550f4f36ae47d8dcc39012497.png

1.3.2 Renderer进程的实现结构

renderer程序继承CefApp和CefRenderProcessHandler类,在main函数中初始化。通过CefSettings.browser_subprocess_path配置render可执行程序路径。browser进程就会去启动这个进程去渲染网页。

d2ece2eb236f17f88492db704f6dc876.png

1.3.3 browser进程的实现结构

browserapp要继承CefApp和CefBrowserProcessHandler类。实现browserapp的定义。同时要新建clienthandler类实现图中的回调函数接口类,用来处理拦截响应请求、管理生命周期、下载、显示加载、右键菜单等。在mian函数中初始化、启动消息循环。调用CefBrowserHost的静态方法创建browser窗口对象,在render进程的Frame中加载渲染内容。

f829a7aef74603278d2b1282d2d19018.png

1.4 CEF多进程和多线程

1.4.1 进程

CEF3是多进程架构的,CEF3进程主要有一个Browser(浏览器)进程和多个Renderer(渲染)进程。Browser被定义为主进程,负责窗口管理,网络请求,网页管理 、网络交互。browser从服务器器请求到了响应,将html文本发送给Renderer 进程,render进程加载html,进行渲染,展示网页的内容;除此之外,Renderer进程还负责Js Binding和对Dom节点的访问。Browser和Renderer进程可以通过发送异步消息进行双向通信。主应用程序很大,加载时间比较长,或者不能在非浏览器进程里使用,则宿主程序可使用独立的可执行文件去运行这些Renderer进程。这可以通过配置CefSettings.browser_subprocess_path变量做到。

1.4.2 线程

Browser进程中包含如下主要的线程:

  • TID_UI 线程是浏览器的主线程。如果应用程序在调用调用CefInitialize()时,传递CefSettings.multi_threaded_message_loop=false,这个线程也是应用程序的主线程。
  • TID_IO 线程主要负责处理IPC消息以及网络通信。
  • TID_FILE 线程负责与文件系统交互。

1.5 网页嵌入应用程序代码构成和实例

每个CEF3应用程序都是相同的结构

  • 提供入口函数,用于初始化CEF、运行子进程执行逻辑或者CEF消息循环。
  • 提供CefApp实现,用于处理进程相关的回调。
  • 提供CefClient实现,用于处理Browser实例相关的回调。
  • 执行CefBrowserHost::CreateBrowser()创建一个Browser实例,使用CefLifeSpanHandler管理Browser对象生命周期。

1.5.1 入口函数

需要在程序的入口函数执行cef对象创建,初始化,命令行参数解析,CEF属性设置,和CEF消息循环开启等。CEF需要启动一个主进程来管理网页见面。这个主进程就是在man函数中启动,进入消息循环,直到程序结束,才退出main函数。

1.5.2 CEF单实例进程

单例进程模式就是CEF的启动,网页的打开都在

int main(int argc, char* argv[]) {

// Structure for passing command-line arguments.

// The definition of this structure is platform-specific.

CefMainArgs main_args(argc, argv);

// Optional implementation of the CefApp interface.

CefRefPtr<MyApp> app(new MyApp);

// Execute the sub-process logic, if any. This will either return immediately for the browser

// process or block until the sub-process should exit.

int exit_code = CefExecuteProcess(main_args, app.get());

if (exit_code >= 0) {

// The sub-process terminated, exit now.

return exit_code;

}

// Populate this structure to customize CEF behavior.

CefSettings settings;

// Initialize CEF in the main process.

CefInitialize(main_args, settings, app.get());

// Run the CEF message loop. This will block until CefQuitMessageLoop() is called.

CefRunMessageLoop();

// Shut down CEF.

CefShutdown();

return 0;

}

1.5.3 主子进程的模式

主进程和子进程分开的模式,主进程运行browser进程,网页加载放在子进程render进程中。这是需要创建两个进程和两个主函数。

主程序的入口函数:

// Program entry-point function.

// 程序入口函数

int main(int argc, char* argv[]) {

// Structure for passing command-line arguments.

// The definition of this structure is platform-specific.

// 传递命令行参数的结构体。

// 这个结构体的定义与平台相关。

CefMainArgs main_args(argc, argv);

// Optional implementation of the CefApp interface.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值