CEF3开发者系列之进程间消息传递

摘要:
在使用CEF3作为框架开发的过程中,在实现WebSockets、XMLHttpRequest、JS和本地客户端交互等功能时,需要在呈现过程和浏览过程中传递消息。CEF3在这方面封装良好。普通用户只需要知道几个接口和功能就可以实现进程间消息传输。根据个人开发经验和理解,以cefclient为例总结CEF3消息传递机制。如果有任何错误,请给我你的建议!SendProcessMessage()有两个参数,即要传递的进程ID CefProcessId和消息CefProcessMessage。所有渲染进程都提供相同的消息传递方法:通过浏览器进程中的CefBrowserProcessHandler::OnRenderProcessThreadCreated(),将消息传递到渲染进程中的cefRenderProcessHandleer::OnRenderThreadCreated)。

在使用CEF3作为框架开发过程中,实现WebSockets、XMLHttpRequest、JS与本地客户端交互等功能时,需要在渲染(Render)进程和浏览(Browser)进程中传递消息。CEF3在这个方面进行了很好的封装,普通用户只需要了解几个接口和函数就可以实现进程间消息传递。根据个人的开发经验和理解,以cefclient为例子总结下CEF3消息的传递机制,有不正确之处,请赐教!

一般通过指定的CefBrowser实例,调用CefBrowser::SendProcessMessage()方法。由于CefBrowserCefFrame对象同时存在于browserrender进程中,所以不管在渲染(Render)进程还是浏览(Browser)进程中,都能调用到SendProcessMessage()方法。SendProcessMessage()有两个参数,进程标识CefProcessId与需要传递的消息CefProcessMessage。

CefProcessId是一个枚举常量,具体代表的意义不解释,看如下所示代码:

1
2
3
4
5
6
7
8
9
10
typedef enum {
  ///
  // Browser process.
  ///
  PID_BROWSER,
  ///
  // Renderer process.
  ///
  PID_RENDERER,
} cef_process_id_t;

 CefProcessMessage是一个管理所需传递消息的类,包含消息名称和消息内容。见下边代码示例:

1
2
3
4
5
6
7
8
9
CefRefPtr<CefProcessMessage> message = CefProcessMessage::Create(CefString("xiaoximingcheng"));  //设置消息名称
 
//检索参数列表对象(Retrieve the argument list object.)
CefRefPtr<CefListValue> args = message->GetArgumentList();
CefString  message_cont; 
 
 //设置消息内容
args->SetString(0, message_cont);
args->SetInt(0, 10)

 进程间传递消息,都要通过GetArgumentList获取和Set*(SetString、SetInt)来设置。所有render进程提供利用相同的消息传递方式:通过browser进程中的CefBrowserProcessHandler::OnRenderProcessThreadCreated()将消息传递给render进程中的CefRenderProcessHandler::OnRenderThreadCreated()。

browser进程发到render进程的消息,被CefRenderProcessHandler::OnProcessMessageReceived()接收,从render进程发到browser进程的消息,被CefBrowserProcessHandler::OnProcessMessageReceived()接收。见下图:

CEF3开发者系列之进程间消息传递第1张

 发送消息的过程前通过关联消息和frame ID(通过CefFrame::GetIdentifier()获取),接收消息进程在接收后,通过CefBrowser::GetFrame()获取Frame相关信息,从而让Frame和消息对应起来,让每个Frame可以处理自己消息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Helper macros for splitting and combining the int64 frame ID value.
#define MAKE_INT64(int_low, int_high)
    ((int64) (((int) (int_low)) | ((int64) ((int) (int_high))) << 32))
#define LOW_INT(int64_val) ((int) (int64_val))
#define HIGH_INT(int64_val) ((int) (((int64) (int64_val) >> 32) & 0xFFFFFFFFL))
 
// Sending the frame ID.
const int64 frame_id = frame->GetIdentifier();
args->SetInt(0, LOW_INT(frame_id));
args->SetInt(1, HIGH_INT(frame_id));
 
// Receiving the frame ID.
const int64 frame_id = MAKE_INT64(args->GetInt(0), args->GetInt(1));
CefRefPtr<CefFrame> frame = browser->GetFrame(frame_id);

免责声明:文章转载自《CEF3开发者系列之进程间消息传递》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Jmeter自动化测试 数据驱动测试,将数据存入csv文件中来调用,或将数据存在DB中进行调用Gitlab配置webhooks实现自动化部署下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

安卓消息推送解决方案

一、推送工具使用 我们在做安卓开发的时候,通常需要一些消息推送功能,我个人平时用的是极光推送,极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度、提高应用的留存率。极光推送客户端支持 Android, iOS 两个平台。 使用的时候我们可以先去官网看开发文档,我是...

MySql 常见错误代码大全 VV2

从机一直1593错误,排查了半天发现是从的配置文件中的server-id没改导致,此低级错误记录下警醒自己 B.1. 服务器错误代码和消息 服务器错误信息来自下述源文件: · 错误消息信息列在share/errmsg.txt文件中。“%d”和“%s”分别代表编号和字符串,显示时,它们将被消息值取代。 · 错误值列在share/errmsg.txt文件中...

nodejs操作消息队列RabbitMQ

一. 什么是消息队列 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。其主要用途:不同进程Process/线程Thread之间通信。 为什么会产生消息队列?有几个原因: 不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改...

openssl3.0 加密算法库编程精要 04 详解 EVP API 消息摘要

4.1 消息摘要的概念   消息摘要有好几个名字,比如单项散列函数,Hash 函数,它是一个将可变长度的输入串转换为一个固定长度的输出 串的函数。大多数消息摘要算法都是公开的,它的安全性依赖于它的单向性,如果仅获取到消息摘要的结果,想要从结果 反推出原文几乎是不可能的事情。并且对于输入串的细微改变,都会引发输出串的雪崩式变化,所以消息摘要一般用于校 验数据...

NOIP2008提高组(前三题) -SilverN

此处为前三题,第四题将单独发布 火柴棒等式 题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自需要两根火柴棍 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0) n根火柴棍必...

winform程序 实现类似 qq 消息提醒功能实现

Winform托盘NotifyIcon使用(类似QQ消息提示) Winform托盘NotifyIcon使用(类似QQ消息提示) 概述:在做cti的过程中,需要在来电的时候在客户端弹出对应的客户信息,所以需要做一个托盘的客户端程序运行,当有来电的时候通过托盘图标的闪动(当然也可以加些音效)来提示坐席人员。这里我使用了NotifyIcon控件实现,主要步骤如下...