【问题标题】:How to send message FROM Chrome extension TO Native app?如何将消息从 Chrome 扩展程序发送到本机应用程序?
【发布时间】:2023-03-22 15:25:01
【问题描述】:

我有一个用 C++ 编写的本机应用程序。

我可以使用 How to send message FROM native app TO Chrome extension? 将数据从我的本机应用程序发送到 chrome 扩展程序

但我无法弄清楚其他方式。

Chrome 文档。状态:Chrome 在单独的进程中启动每个本机消息传递主机,并使用标准输入 (stdin) 和标准输出 (stdout) 与其通信。双向发送消息使用相同的格式:每条消息都使用 JSON 序列化,UTF-8 编码,并以原生字节顺序的 32 位消息长度开头。

如何从标准输入读取/解释由 chrome-extension 发送的数据?

如何读取 4 字节长度信息以及发送 UTF-8 编码的其余数据?

请帮忙!

谢谢!

【问题讨论】:

  • 原生应用只是为特定平台编写的 C++ 程序?
  • @Acidic 是的。就我而言,它是 Windows 平台。

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


【解决方案1】:

正如 cmets 中提到的,如果 长度大于 255,所提供的解决方案将不起作用。例如,如果实际长度为 296(二进制 00000001 00101000),则前面提出的解决方案将产生 41 => 00000001 + 00101000 = 1 + 40 = 41。

必须考虑读取的字节数。在这个例子中,计算长度的正确方法是 1*(2^8) + 40 = 296。所以正确的解决方案可能是:

unsigned int length = 0;

//read the first four bytes
for (int i = 0; i < 4; i++) {
  int read_char = getchar();
  length += read_char * (int) pow(2.0, i * 8);
}

基于位移位和位操作的更好解决方案如下所示(可能有点难以理解,但肯定更简洁):

unsigned int length = 0;

for (int i = 0; i < 4; i++) {
  unsigned int read_char = getchar();
  length = length | (read_char << i * 8);
}

请务必注意,getchar() 在与当前长度值执行位 OR 之前返回转换为 unsigned int 的 int(int 保留一位用于符号,unsigned int 没有)。

现在,我不确定此处可能出现的潜在大/小端问题,因为我尚未在不同架构上测试此解决方案。希望有经验的大侠评论一下。

【讨论】:

    【解决方案2】:

    从标准输入读取 json 数据:

    int _tmain(int argc, _TCHAR* argv[])
    {
    
    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();
    }
    }
    

    【讨论】:

    • 但我现在面临的问题是,当我将本机应用程序代码置于连续 (while) 循环中时,它会停止工作。
    • 而且我无法通过我的 c++ 应用程序将任何内容写入文件(用于记录目的)。是安全约束吗?
    • “停止工作”是什么意思?您也可以尝试“chrome.runtime.sendNativeMessage”功能。那么你就不需要在 c++ 主机中循环了。
    • “停止工作”是指,当我在本机应用程序中引入循环时,扩展程序会停止获取我的消息。我不能使用 sendNativeMessage,因为我只需要让我的程序的一个实例运行。
    • 如果只是将字节添加到整数中,它如何读取 255 字节以上的长度?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2016-05-20
    • 1970-01-01
    相关资源
    最近更新 更多