Google Chrome Native Messaging开发实录(三)Native Host


接上一篇《Google Chrome Native Messaging开发实录(二)Chrome Extension扩展》完成了Chrome扩展部分后,继续实现Native Host部分。Chrome Native Messaging对Native Host的要求不高,只要支持stdio标准的输入输出,任何进程形式都是可以的,既可以是某种开发语言(C/C++/C#/Python/Java/node.js/……)实现的控制台或系统服务,也可以是windows上.bat/power shell这样指令处理,所以范围可以说够广了。

windows环境下的具体的步骤如下:

1.创建注册文件,向Chrome注册Native Host。

nativehost.reg

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts\com.my.printer]
@="X:\\Path\\To\\nmh-manifest.json"

[HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.my.printer]
@="X:\\Path\\To\\nmh-manifest.json"

要注意的细节就是NativeMessagingHosts节点下的键值对,键就是host的名称,与前面的扩展中chrome.runtime.connectNative传入的参数是一致的,而值是将要被调用的Native Host程序的物理路径,windows下可以用相对路径。

OS X和Linux的注册看这里,[传送门]:https://developer.chrome.com/extensions/nativeMessaging

2.创建Native Host配置文件

nmh-manifest.json

{
  "name": "com.my.printer",
  "description": "My Printer",
  "path": "X:\\Path\\To\\MyPrinter.exe",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://you_extension_id/"
  ]
}

3.c++实现的一个控制台示例程序。

MyPrinter.exe

// MyPrinter.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "MyPrinter.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一的应用程序对象

//CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0; unsigned
int length = 0; //read the first four bytes (=> Length) for (int i = 0; i < 4; i++) { length += getchar(); } //read the json-message string msg = ""; for (int i = 0; i < length; i++) { msg += getchar(); } string result = "my card no is 00001234";
//prepare output json-message
string outMsg = "{\"cardno\":\"" + result + "\"}"; unsigned int outLen = outMsg.length(); char *bOutLen = reinterpret_cast<char *>(&outLen); cout.write(bOutLen, 4); cout << outMsg << flush; return nRetCode; }

这里用比较拙劣的方式实现了读取扩展传进来的消息,并且返回消息给扩展,因为Native Messaging要求消息的格式是json的,如果要实现根据不同的消息做不同的逻辑操作,还是要使用json库更恰当一些。

到此可以说,编码的部分就全部完成了,其实挺简单的,对吧。下一篇会讲述收尾遇到的一些实际问题。

优质内容筛选与推荐>>
1、循环和递归求阶乘、递归实现汉诺塔程序
2、python 暑期实训1
3、管理信息系统的开发与管理
4、消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
5、UIImageView的contentMode属性


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn