採用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类的构造函数原型例如以下:

  1. Endpoint(const std::string& name, Listener* listener, bool start_now);

它须要一个Listener。所以我们须要先实现Listener接口。IPC::Listener定义例如以下:

  1. class Listener {
  2. public:
  3. // Called when a message is received. Returns true iff the message was
  4. // handled.
  5. virtual bool OnMessageReceived(Message* message) = 0;
  6. // Called when the channel is connected and we have received the internal
  7. // Hello message from the peer.
  8. virtual void OnChannelConnected(int32 peer_pid) {}
  9. // Called when an error is detected that causes the channel to close.
  10. // This method is not called when a channel is closed normally.
  11. virtual void OnChannelError() {}
  12. protected:
  13. virtual ~Listener() {}
  14. };

我们从Listener派生的类,实现OnMessageReceived、OnChannelConnected、OnChannelError三个方法就可以处理IPC消息和状态。

那如今我们仅仅须要一行代码就能够创建一个接入点等待连接了:

  1. m_endPoint = new IPC::Endpoint("ppapi_ipc", this);

注意this指针代表的类实现了IPC::Listener接口。类声明例如以下:

  1. class IPCImageClient : public IPC::Listener
  2. {
  3. public:
  4. IPCImageClient();
  5. virtual bool OnMessageReceived(IPC::Message* msg);
  6. virtual void OnChannelConnected(int32 peer_pid);
  7. virtual void OnChannelError();
  8. private:
  9. void SendRawImage();
  10. void SendDecodedImage();
  11. protected:
  12. int m_peerPid;
  13. IPC::Endpoint *m_endPoint;
  14. };

而发送消息、接收或处理消息,就要用到Message类。发送消息的代码相似以下:

  1. scoped_ref_ptr<IPC::Message> msg(new IPC::Message(GetCurrentProcessId(), 101, (IPC::Message::PriorityValue)0));
  2. msg->WriteBytes(data, size);
  3. m_endPoint->Send(msg.get());

接收消息的代码相似这样:

  1. bool IPCImageClient::OnMessageReceived(IPC::Message* msg)
  2. {
  3. uint32 type = msg->type();
  4. switch (type)
  5. {
  6. case 1: // data was consumed,write again
  7. OutputDebugString(_T("SendImage to plugin\r\n"));
  8. SendDecodedImage();
  9. break;
  10. }
  11. return true;
  12. }

或者这样:

  1. bool IPCSimpleClient::OnMessageReceived(IPC::Message* msg)
  2. {
  3. const void *data = msg->payload();;
  4. unsigned int len = msg->payload_size();
  5. UIImage *imageView = (UIImage*)m_view;
  6. uint32 type = msg->type();
  7. switch (type)
  8. {
  9. case 100: // decoded image data
  10. {
  11. OutputDebugString(_T("received decoded image\r\n"));
  12. SkBitmap received;
  13. SkImageInfo info = SkImageInfo::Make(1280, 720,
  14. kBGRA_8888_SkColorType, kPremul_SkAlphaType,
  15. kLinear_SkColorProfileType);
  16. received.installPixels(info, (void*)data, info.minRowBytes());
  17. imageView->cloneBitmapFrom(received);
  18. imageView->requestPaint(NULL);
  19. }
  20. break;
  21. ...
  22. }
  23. }

总结一下。使用AsyncIpc的过程例如以下:

  • 实现IPC::Listener接口
  • 创建IPC::EndPoint对象,传递Listener接口给它
  • 当连接建立后,发送消息(能够在OnChannelConnected方法中)
  • 在Listener::OnMessageReceived方法中处理消息

就这样吧。

其它參考文章:

PPAPI与Browser间使用AsyncIPC通信的更多相关文章

  1. Windows进程间共享内存通信实例

    Windows进程间共享内存通信实例 抄抄补补整出来 采用内存映射文件实现WIN32进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保 ...

  2. PC和FPGA间的串口通信实现

    应用笔记 V1.0 2015/03/26 PC和FPGA间的串口通信实现   概述   本文将介绍PC和FPGA间的串口通信实现的基本思路和Verilog代码,对于通信而言,收发双方都要有相应的控制. ...

  3. 用隧道协议实现不同dubbo集群间的透明通信

    用隧道协议实现不同dubbo集群间的透明通信 前言 笔者最近完成了一个非常有意思的隧道机制(已在产线运行),可以让注册到不同zookeeper之间的dubbo集群之间能够正常进行通信.如下图所示: 例 ...

  4. 【VxWorks系列】任务间同步与通信之共享内存

    在开始之前先说明三个概念,任务间的同步,互斥,通信. 同步,是指一个任务等待某个条件发生,而另外一个任务引发这个条件后,等待的任务会被触发执行相应的处理.这就是一个任务与另一任务之间的同步控制. 互斥 ...

  5. Java多线程(三) 多线程间的基本通信

    多条线程在操作同一份数据的时候,一般需要程序去控制好变量.在多条线程同时运行的前提下控制变量,涉及到线程通信及变量保护等. 本博文主要总结:①线程是如何通信  ②如何保护线程变量 1.Java里的线程 ...

  6. 线程间使用socket通信的计算器

    该程序是处理平时的算数运算,程序也没有什么特别之处,只是将所有运算分开运算,每个函数(线程)处理不同的运算符号里面的运算,然后将所有结果都汇总到main函数中进行最后汇总(相加减)运算,每个函数内都处 ...

  7. 【VxWorks系列】任务间同步与通信之信号量

    信号量是VxWorks提供的最常用,最快速的一种任务间通信机制.VxWorks中信号量有三种:二值信号量,互斥信号量,计数信号量.下面一一介绍这三种信号量的作用与区别. 信号量通常的作用就是是控制任务 ...

  8. iOS开发之线程间的MachPort通信与子线程中的Notification转发

    如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...

  9. Angular中不同的组件间传值与通信的方法

    主要分为父子组件和非父子组件部分. 父子组件间参数与通讯方法 使用事件通信(EventEmitter,@Output): 场景:可以在父子组件之间进行通信,一般使用在子组件传递消息给父组件: 步骤: ...

随机推荐

  1. 关于java读取文件IO流学习总结(一)

    IO流的分类: 1.根据流的数据对象来分: 高端流:所有的内存中的流都是高端流,比如:InputStreamReader 低端流:所有的外界设备中的流都是低端流,比如InputStream,Outpu ...

  2. 【2018.12.10】NOI模拟赛3

    题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...

  3. 【2018.10.10】[HNOI2008] GT考试(bzoj1009)

    10pts: 暴力枚举字符串,Hash判是否出现.(真会有人写么) 时间复杂度$O(10^n*n)$. 40pts: 学过OI的人都会写的dp 如果这道题的40pts($n\le 250000$)设成 ...

  4. response.setHeader参数、用法的介绍

    response.setHeader 是用来设置返回页面的头 meta 信息, 使用时 response.setHeader( name, contect ); meta是用来在HTML文档中模拟HT ...

  5. 《写给大忙人看的Java核心技术》 勘误

    先附上十分讨喜的封面.这应该是爱丽丝梦游仙境里的那只兔子吧? 勘误表基于原版勘误表制作 链接 截止日期 2017-02-09 对应<写给大忙人看的Java核心技术>2016年1月第1次印刷 ...

  6. JSONObject与JSONArray的使用(jackson)

    1.创建一个JSONObject对象 package com.resource.controller.web; import java.util.ArrayList; import java.util ...

  7. JSP表单提交中文乱码

    简要笔记:由于jsp默认表单提交编码方式是:ISO-8859-1,而我们需要的是utf-8或者是gbk码,故需要转化. 具体方法是:在表单处理文件中,将获取到的变量进行转换. String userN ...

  8. iOS常用三方库收集

    除非Pod可以直接加载到工程中的外,收集一下 https://github.com/kejinlu/KKGestureLockView          好用的手势解锁

  9. PHP html_entity_decode() 函数

    html_entity_decode(string,flags,character-set) 把 HTML 实体转换为字符. html_entity_decode() 函数是 htmlentities ...

  10. 模拟用户登录-SpringMVC+Spring+Mybatis整合小案例

    1. 导入相关jar包 ant-1.9.6.jarant-launcher-1.9.6.jaraopalliance.jarasm-5.1.jarasm-5.2.jaraspectj-weaver.j ...