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库更恰当一些。

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

posted on 2017-03-23 11:22  Bean.Hsiang  阅读(64)  评论(0编辑  收藏  举报