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库更恰当一些。
到此可以说,编码的部分就全部完成了,其实挺简单的,对吧。下一篇会讲述收尾遇到的一些实际问题。