Chrome的本机消息发送/接收二进制数据

时间:2016-12-07 12:43:23

标签: google-chrome-extension chrome-native-messaging

我正在使用Chrome扩展程序,该扩展程序通过Chrome消息传递协议与外部可执行文件通信。外部应用程序接受媒体文件的绝对路径或从stdout获取其二进制内容。

由于只有扩展端可以访问实际文件(来自拖放操作),并且无法将绝对路径发送到外部应用程序,我想我会通过{{1}读取二进制输入文件并将二进制文件发送到可执行文件。虽然似乎没有一种向外部可执行文件发送和接收二进制字符串(或类型化数组)的好方法。

我希望有一种方法可以发送键入数组所在位置的指针。

知道如何通过本机消息传递协议从外部可执行文件发送和接收大型二进制字符串。

https://developer.chrome.com/extensions/nativeMessaging

2 个答案:

答案 0 :(得分:1)

除了使用自己的协议来分割二进制数据并将它们通过JSON从浏览器扩展传输到本地应用程序然后一起收集二进制数据块之外,没有别的办法了。请注意,JSON字符串的总大小最多可为4 GB(Chrome,Firefox)或2 GB(MS Edge,因为它在内部使用16位字符),这在创建消息块时需要考虑。

答案 1 :(得分:0)

你说,"似乎不是向外部可执行文件发送和接收二进制字符串(或类型化数组)的好方法。"是的,有一个很好的方法,至少在c ++中。我们使用以下命令从可执行文件发送到扩展名:

WriteFile(hStdOut, (LPVOID)&bufMsg[0], dwNumBytesToWrite, &dwNumBytesWritten, NULL);

hStdOut是stdout的句柄,我们通过这种调用在外部可执行文件(本机主机应用程序)中获取它:

hStdOut = (HANDLE) _get_osfhandle(nStdOutDescriptor);

我们首先通过获取端口来从扩展程序发送到本机主机应用程序(可执行文件):

var port = chrome.runtime.connect(myExtensionId);

然后在端口上调用postMessage(),如下所示:

port.postMessage({ message:"my-image-data-msg", myImgdata: data});

通过调用postMessage(),您的消息和图像数据将被发送到可执行文件,通过监视标准输入来读取它们。