PPAPI与Browser间使用AsyncIPC通信
採用AsyncIpc这个项目(https://github.com/hicdre/AsyncIpc)。来完毕PPAPI Plugin进程与Browser进程的通信。
foruok原创。如需转载请关注foruok的微信订阅号“程序视界”联系foruok。
AsyncIpc的IPC实现基于管道,是參考Chromium的IPC代码而来,适用于Windows。Chromium在Render和Browser进程间就使用相似的IPC机制,每个Render都会与Browser建立一个双向的Channel。AsyncIpc採用相似的概念。抽象了Channel用于进程间通信。
基本使用方法
介绍下怎么集成AsyncIpc以及关键的类库。
引入方式
AsyncIpc能够编译为静态库和动态库。依据须要。也能够直接把源代码增加到项目中。
类库
AyncIpc定义了一个名字空间IPC。IPC::EndPoint代表一个接入点,使用时须要创建一个接入点。
当有对端进程接入时,EndPoint会发送一些通知,这些通知通过IPC::Listener接口发送。所以,实现Listener接口就可以。
EndPoint类的构造函数原型例如以下:
Endpoint(const std::string& name, Listener* listener, bool start_now);
它须要一个Listener。所以我们须要先实现Listener接口。IPC::Listener定义例如以下:
class Listener {
public:
// Called when a message is received. Returns true iff the message was
// handled.
virtual bool OnMessageReceived(Message* message) = 0;
// Called when the channel is connected and we have received the internal
// Hello message from the peer.
virtual void OnChannelConnected(int32 peer_pid) {}
// Called when an error is detected that causes the channel to close.
// This method is not called when a channel is closed normally.
virtual void OnChannelError() {}
protected:
virtual ~Listener() {}
};
我们从Listener派生的类,实现OnMessageReceived、OnChannelConnected、OnChannelError三个方法就可以处理IPC消息和状态。
那如今我们仅仅须要一行代码就能够创建一个接入点等待连接了:
m_endPoint = new IPC::Endpoint("ppapi_ipc", this);
注意this指针代表的类实现了IPC::Listener接口。类声明例如以下:
class IPCImageClient : public IPC::Listener
{
public:
IPCImageClient();
virtual bool OnMessageReceived(IPC::Message* msg);
virtual void OnChannelConnected(int32 peer_pid);
virtual void OnChannelError();
private:
void SendRawImage();
void SendDecodedImage();
protected:
int m_peerPid;
IPC::Endpoint *m_endPoint;
};
而发送消息、接收或处理消息,就要用到Message类。发送消息的代码相似以下:
scoped_ref_ptr<IPC::Message> msg(new IPC::Message(GetCurrentProcessId(), 101, (IPC::Message::PriorityValue)0));
msg->WriteBytes(data, size);
m_endPoint->Send(msg.get());
接收消息的代码相似这样:
bool IPCImageClient::OnMessageReceived(IPC::Message* msg)
{
uint32 type = msg->type();
switch (type)
{
case 1: // data was consumed,write again
OutputDebugString(_T("SendImage to plugin\r\n"));
SendDecodedImage();
break;
}
return true;
}
或者这样:
bool IPCSimpleClient::OnMessageReceived(IPC::Message* msg)
{
const void *data = msg->payload();;
unsigned int len = msg->payload_size();
UIImage *imageView = (UIImage*)m_view;
uint32 type = msg->type();
switch (type)
{
case 100: // decoded image data
{
OutputDebugString(_T("received decoded image\r\n"));
SkBitmap received;
SkImageInfo info = SkImageInfo::Make(1280, 720,
kBGRA_8888_SkColorType, kPremul_SkAlphaType,
kLinear_SkColorProfileType);
received.installPixels(info, (void*)data, info.minRowBytes());
imageView->cloneBitmapFrom(received);
imageView->requestPaint(NULL);
}
break;
...
}
}
总结一下。使用AsyncIpc的过程例如以下:
- 实现IPC::Listener接口
- 创建IPC::EndPoint对象,传递Listener接口给它
- 当连接建立后,发送消息(能够在OnChannelConnected方法中)
- 在Listener::OnMessageReceived方法中处理消息
就这样吧。
其它參考文章:
- 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进程间通信
- Chromium与CEF的多进程模型及相关參数
PPAPI与Browser间使用AsyncIPC通信的更多相关文章
- Windows进程间共享内存通信实例
Windows进程间共享内存通信实例 抄抄补补整出来 采用内存映射文件实现WIN32进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保 ...
- PC和FPGA间的串口通信实现
应用笔记 V1.0 2015/03/26 PC和FPGA间的串口通信实现 概述 本文将介绍PC和FPGA间的串口通信实现的基本思路和Verilog代码,对于通信而言,收发双方都要有相应的控制. ...
- 用隧道协议实现不同dubbo集群间的透明通信
用隧道协议实现不同dubbo集群间的透明通信 前言 笔者最近完成了一个非常有意思的隧道机制(已在产线运行),可以让注册到不同zookeeper之间的dubbo集群之间能够正常进行通信.如下图所示: 例 ...
- 【VxWorks系列】任务间同步与通信之共享内存
在开始之前先说明三个概念,任务间的同步,互斥,通信. 同步,是指一个任务等待某个条件发生,而另外一个任务引发这个条件后,等待的任务会被触发执行相应的处理.这就是一个任务与另一任务之间的同步控制. 互斥 ...
- Java多线程(三) 多线程间的基本通信
多条线程在操作同一份数据的时候,一般需要程序去控制好变量.在多条线程同时运行的前提下控制变量,涉及到线程通信及变量保护等. 本博文主要总结:①线程是如何通信 ②如何保护线程变量 1.Java里的线程 ...
- 线程间使用socket通信的计算器
该程序是处理平时的算数运算,程序也没有什么特别之处,只是将所有运算分开运算,每个函数(线程)处理不同的运算符号里面的运算,然后将所有结果都汇总到main函数中进行最后汇总(相加减)运算,每个函数内都处 ...
- 【VxWorks系列】任务间同步与通信之信号量
信号量是VxWorks提供的最常用,最快速的一种任务间通信机制.VxWorks中信号量有三种:二值信号量,互斥信号量,计数信号量.下面一一介绍这三种信号量的作用与区别. 信号量通常的作用就是是控制任务 ...
- iOS开发之线程间的MachPort通信与子线程中的Notification转发
如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...
- Angular中不同的组件间传值与通信的方法
主要分为父子组件和非父子组件部分. 父子组件间参数与通讯方法 使用事件通信(EventEmitter,@Output): 场景:可以在父子组件之间进行通信,一般使用在子组件传递消息给父组件: 步骤: ...
随机推荐
- 洛谷P3393 逃离僵尸岛
题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...
- spl_autoload_register() && __autoload函数
一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数. 在index.php中,由于没有包含test.class.php,在实例化printit时 ...
- CentOS配置DHCP服务器
知识储备 bootp (boot protocol) 早前用于无盘工作站,dhcp的前身 IP初次分配完成,以后固定mac和IP绑定关系 dhcp基础 获取IP步骤 step1: Client dhc ...
- treetable 用法小例
插件地址:http://pan.baidu.com/s/1kVf0Kcfcript src="/plugins/jQuery/jQuery-2.1.4.min.js">< ...
- [BOI2007] Sequence
题目描述 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列.这一 ...
- MongoDB学习day10--Mongoose的populate实现关联查询
一.Mongoose populate官方文档 https://mongoosejs.com/docs/populate.html 二.Mongoose populate关联查询 1.定义ref va ...
- Centos常用命名
1.关机 (系统的关机.重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours: ...
- sqlite 常用操作
#查看当前数据库信息 .database #列出所有表 .tables #列出所有字段 .schema 或者 .schema table_name #清空一张表 delete from tabl ...
- Multiple analytic account plans多辅助核算方案
定义核算方案 菜单 会计/设置/辅助核算会计/多个方案 点击"创建"按钮 说明 辅助核算方案,输入方案名称 点击"添加一个 ...
- win10 UWP 申请微软开发人员
申请微软开发人员能够到https://dev.windows.com/zh-cn/programs/join 假设是学生,先去http://www.dreamspark.com/ 假设是英文,点stu ...