CEF中Browser进程与Render进程间通信
来源:互联网 发布:项目数据库设计 编辑:程序博客网 时间:2024/05/29 03:06
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方法内):
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方法:
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类中:
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++交互
- CEF中Browser进程与Render进程间通信
- CEF JS与browser进程间的异步通信
- MFC使用CEF内核,Browser进程与Renderer进程之间的通信(***)
- MFC使用CEF并实现js与C++交互功能,解决Render进程中OnContextCreated绑定与OnWebKitInitialized的js扩展无法回调问题
- 进程与进程间通信
- 进程与进程通信
- chromium browser process 与 render process 间通信通道的建立
- 进程与进程间的通信
- (转)进程与进程间通信
- Linux进程、线程与进程间通信
- Qt:进程与进程间通信
- Linux C 进程与进程间通信
- 进程与线程及进程间通信
- 进程与进程,进程与内核间通信(netlink)
- cef 单进程issue
- 进程&进程间通信
- 指针与进程间通信
- Android中进程间通信
- 对于windows窗口编程的详细注解代码
- [leetcode] Dungeon game
- html5拖拽
- 动画学习 四
- html5异步上传文件
- CEF中Browser进程与Render进程间通信
- JavaSE017_数组之应用举例(利用二维数组实现五子棋功能完善——二人对战)
- Codeforces Round #329 (Div. 2) 593A 2Char
- Codeforces Round #329 (Div. 2) 593B - Anton and Lines
- 在 Windows 10 上安装 Arduino 开发环境
- 配置文件格式用哪个?目录+纯文本文件,XML,SQLite
- 树状数组
- 采购订单检查/保存BADI使用
- BING