CEF中Browser进程与Render进程间通信
2016-01-26 07:05
381 查看
https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage提到了CEF提供的Browser与Browser进程通信的几种机制,我实验了Process Runtime Messages这种方式,用到了CefProcessMessage和CefBrowser::SendProcessMessage()。
我是在CEF中JS与C++交互一文的基础上完成的,我们边说基本步骤,边给出关键代码。
foruok原创,如需转载请关注foruok的微信订阅号“程序视界”联系foruok。
发送消息
发送消息使用CefBrowser::SendProcessMessage() ,SendProcessMessage第一个参数是CefProcessId,给Browser进程发送,就用PID_BROWSER,给Render进程发送,就用PID_RENDERER。
我在Render进程发送消息的代码如下(ClientV8Handler的Execute方法内):
我把那个cef_js_integration示例中收到的登陆消息(Render进程)发送给Browser进程。
处理消息
Browser进程这边,重写CefClient::OnProcessMessageReceived()这个方法来处理跨进程消息。
以cef_js_integration为例,是在ClientHandler中重写了OnProcessMessageReceived方法:
可以看到,上面的代码又给Render进程发了个消息。
Render进程这边, 重写CefRenderProcessHandler::OnProcessMessageReceived()方法来处理来自Browser进程的消息,具体代码在ClientAppRender类中:
好啦,这就是整个过程了。
其他参考文章:
CEF Windows开发环境搭建
CEF加载PPAPI插件
VS2013编译最简单的PPAPI插件
理解PPAPI的设计
PPAPI插件与浏览器的交互过程
Windows下从源码编译CEF
编译PPAPI的media_stream_video示例
PPAPI插件的绘图与输入事件处理
在PPAPI插件中创建本地窗口
PPAPI插件与浏览器的通信
Windows下从源码编译Skia
在PPAPI插件中使用Skia绘图
加载DLL中的图片资源生成Skia中的SkBitmap对象
PPAPI+Skia实现的涂鸦板
PPAPI中使用Chromium的3D图形接口
PPAPI中使用OpenGL ES绘图
CEF中JS与C++交互
我是在CEF中JS与C++交互一文的基础上完成的,我们边说基本步骤,边给出关键代码。
foruok原创,如需转载请关注foruok的微信订阅号“程序视界”联系foruok。
发送消息
发送消息使用CefBrowser::SendProcessMessage() ,SendProcessMessage第一个参数是CefProcessId,给Browser进程发送,就用PID_BROWSER,给Render进程发送,就用PID_RENDERER。
我在Render进程发送消息的代码如下(ClientV8Handler的Execute方法内):
[code] CefRefPtr<CefProcessMessage> msg = CefProcessMessage::Create("login_msg"); // Retrieve the argument list object. CefRefPtr<CefListValue> args = msg->GetArgumentList(); // Populate the argument values. args->SetSize(2); args->SetString(0, strUser); args->SetString(1, strPassword); // Send the process message to the browser process. CefV8Context::GetCurrentContext()->GetBrowser()->SendProcessMessage(PID_BROWSER, msg);
我把那个cef_js_integration示例中收到的登陆消息(Render进程)发送给Browser进程。
处理消息
Browser进程这边,重写CefClient::OnProcessMessageReceived()这个方法来处理跨进程消息。
以cef_js_integration为例,是在ClientHandler中重写了OnProcessMessageReceived方法:
[code]bool ClientHandler::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) { const std::string& messageName = message->GetName(); if (messageName == "login_msg") { // extract message CefRefPtr<CefListValue> args = message->GetArgumentList(); CefString strUser = args->GetString(0); CefString strPassword = args->GetString(1); TCHAR szLog[256] = { 0 }; _stprintf_s(szLog, 256, _T("BrowserProcess, user - %s, password - %s\r\n"), strUser.c_str(), strPassword.c_str()); OutputDebugString(szLog); //send reply to render process CefRefPtr<CefProcessMessage> outMsg = CefProcessMessage::Create("login_reply"); // Retrieve the argument list object. CefRefPtr<CefListValue> replyArgs = outMsg->GetArgumentList(); // Populate the argument values. replyArgs->SetSize(1); replyArgs->SetInt(0, 0); // Send the process message to the renderer process. browser->SendProcessMessage(PID_RENDERER, outMsg); return true; } return false; }
可以看到,上面的代码又给Render进程发了个消息。
Render进程这边, 重写CefRenderProcessHandler::OnProcessMessageReceived()方法来处理来自Browser进程的消息,具体代码在ClientAppRender类中:
[code]bool ClientAppRenderer::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) { const std::string& messageName = message->GetName(); if (messageName == "login_reply") { // extract message CefRefPtr<CefListValue> args = message->GetArgumentList(); int status = args->GetInt(0); OutputDebugString(status == 0 ? _T("Renderer process, login ok\r\n") : _T("Renderer process, login failed\r\n")); CefRefPtr<CefFrame> frame = browser->GetMainFrame(); frame->ExecuteJavaScript("alert('Got Login Reply from Browser process')", frame->GetURL(), 0); return true; } return false; }
好啦,这就是整个过程了。
其他参考文章:
CEF Windows开发环境搭建
CEF加载PPAPI插件
VS2013编译最简单的PPAPI插件
理解PPAPI的设计
PPAPI插件与浏览器的交互过程
Windows下从源码编译CEF
编译PPAPI的media_stream_video示例
PPAPI插件的绘图与输入事件处理
在PPAPI插件中创建本地窗口
PPAPI插件与浏览器的通信
Windows下从源码编译Skia
在PPAPI插件中使用Skia绘图
加载DLL中的图片资源生成Skia中的SkBitmap对象
PPAPI+Skia实现的涂鸦板
PPAPI中使用Chromium的3D图形接口
PPAPI中使用OpenGL ES绘图
CEF中JS与C++交互
相关文章推荐
- kylin一种OLAP的实现
- 红砖瓦房梧桐树
- html5异步上传文件
- [leetcode] Dungeon game
- 动画学习 三
- 继往开来-忆2015之工作篇
- html5拖拽
- 用Python实现一个类Unix的tail命令
- 二分法 冒泡
- find Minimum and Maximum in Rotated Sorted Arrray
- Codeforces Round #328 (Div. 2) 592 D. Super M 树的直径
- Codeforces Round #328 (Div. 2) 592 C. The Big Race
- 关于鸣人发招
- ansible官方文档翻译之变量
- ansible官方文档翻译之变量
- Codeforces Round #328 (Div. 2) 592 B. The Monster and the Squirrel
- Codeforces Round #328 (Div. 2) 592A PawnChess
- Osmocom-BB多信道修改代码相关
- C118 免按开机自动加载固件
- 关于清除浮动