【问题标题】:How to send message FROM native app TO Chrome extension?如何将消息从本机应用程序发送到 Chrome 扩展程序?
【发布时间】:2013-08-08 19:39:09
【问题描述】:

我已阅读文档,但仍然无法实现。 我有用 C 和 Chrome 扩展编写的桌面应用程序。我知道如何在我的 chrome 扩展程序中接收此消息:

port.onMessage.addListener(function(msg) {
    console.log("Received" + msg);
});

我应该在我的 C 应用程序中写什么来向我的 chrome 扩展程序发送消息? Python/NodeJS 示例也适用。

【问题讨论】:

标签: google-chrome-extension google-chrome-devtools


【解决方案1】:

为了让原生消息传递主机将数据发送回 Chrome,您必须先发送四个字节的长度信息,然后将 JSON 格式的消息作为字符串/字符数组发送。

以下分别是 C 和 C++ 的两个示例,它们以略微不同的方式执行相同的操作。

C 示例:

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
    // Define our message
    char message[] = "{\"text\": \"This is a response message\"}";
    // Collect the length of the message
    unsigned int len = strlen(message);
    // We need to send the 4 bytes of length information
    printf("%c%c%c%c", (char) (len & 0xff),
                       (char) ((len>>8) & 0xFF),
                       (char) ((len>>16) & 0xFF),
                       (char) ((len>>24) & 0xFF));
    // Now we can output our message
    printf("%s", message);
    return 0;
}

C++ 示例:

#include <string.h>

int main(int argc, char* argv[]) {
    // Define our message
    std::string message = "{\"text\": \"This is a response message\"}";
    // Collect the length of the message
    unsigned int len = message.length();
    // We need to send the 4 bytes of length information
    std::cout << char(((len>>0) & 0xFF))
              << char(((len>>8) & 0xFF))
              << char(((len>>16) & 0xFF))
              << char(((len>>24) & 0xFF));
    // Now we can output our message
    std::cout << message;
    return 0;
}

(实际消息可以与长度信息同时发送;只是为了清楚起见将其分开。)

所以按照 OP Chrome 的例子,这里是如何输出消息的:

port.onMessage.addListener(function(msg) {
    console.log("Received" + msg.text);
});

实际上,不需要使用“文本”作为从您的本地消息传递应用程序返回的键;它可以是任何东西。从您的本机消息传递应用程序传递给侦听器的 JSON 字符串将转换为 JavaScript 对象。

有关将上述技术与 jsoncpp(C++ JSON 库)结合使用并解析发送到应用程序的请求的原生消息传递应用程序的 C++ 示例,请参见此处:https://github.com/kylehuff/libwebpg/blob/22d4843f41670d4fd7c4cc7ea3cf833edf8f1baf/webpg.cc#L4501

【讨论】:

  • 亲爱的@kylehuff,我想通过本机消息传递使用 c++ dll (winscard.dll) 来进行 chrome 浏览器扩展,但是我无法建立这种连接。是否可以通过native messaging进行这种沟通?
【解决方案2】:

你可以看看这里,这是一个示例 python 脚本,它向扩展发送和接收消息: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/nativeMessaging/host/native-messaging-example-host?revision=227442

据我了解,为了发送消息,您需要:

  1. 将消息的长度写入控制台
  2. 写三个 \0 字符
  3. 以纯文本形式写下您的信息

这是为我完成这项工作的 C# 代码:

String str = "{\"text\": \"testmessage\"}";

Stream stdout = Console.OpenStandardOutput();

stdout.WriteByte((byte)str.Length);
stdout.WriteByte((byte)'\0');
stdout.WriteByte((byte)'\0');
stdout.WriteByte((byte)'\0');
Console.Write(str);

以及上面链接中的python代码:

sys.stdout.write(struct.pack('I', len(message)))
sys.stdout.write(message)
sys.stdout.flush()

有趣的是它并没有显式输出三个\0字符,但是在输出struct.pack之后它们似乎出现了,不知道为什么......

另外注意,需要以JSON格式发送消息,否则似乎不起作用。

【讨论】:

  • 前 4 个字节实际上是 int,其中包含 str 长度(以字节为单位)。因此,如果 str 超过 256 个字节,您的解决方案将失败。此外,您可能希望将输出流编码指定为 UTF-8,它可能是默认值,但以防万一。
  • @phq 感谢您的澄清!
【解决方案3】:

我使用了write函数:

write(1,buf,n);

buf 是你的消息,n 是长度,如果你的消息 您也可以使用 printf。

【讨论】:

  • 我正在尝试解决同样的问题。我知道如何接收消息,但不清楚如何发送。这篇文章是否暗示任何写入标准输出的内容都会传递给任何正在侦听消息的 chrome 应用程序?我的本机应用程序是一个 .Net 控制台应用程序。这是否意味着发送到 Console.WriteLine 的任何内容最终都会传递给 Chrome?
  • @Kywillis 起初我也很困惑,然后阅读文档解释说它使用 stdio 但必须注册主机,您可以在清单文件中指定允许与之通信的扩展名。 developer.chrome.com/extensions/nativeMessaging
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2014-11-03
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2016-05-20
  • 1970-01-01
相关资源
最近更新 更多