Windows 上的 Chrome 原生消息传递

Posted

技术标签:

【中文标题】Windows 上的 Chrome 原生消息传递【英文标题】:Chrome native messaging on windows 【发布时间】:2014-02-22 22:58:22 【问题描述】:

我认为它已经在等待答案,但不确定: Native app does not work in Chrome extension 在 Linux 上,它运行良好,但在 Windows 7 和 8 上,我总是收到错误“找不到指定的本机消息传递主机”。

这是我的注册表(我已经尝试过使用双反斜杠和 HKEY_LOCAL_MACHINE):

REG ADD HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.google.chrome.example.echo /ve /d C:\Users\Chriss\Desktop\nativeMessaging\host\com.google.chrome.example.echo-win.json

ma​​nifest.json


    // Extension ID: knldjmfmopnpolahpmmgbagdohdnhkik
    "key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcBHwzDvyBQ6bDppkIs9MP4ksKqCMyXQ/A52JivHZKh4YO/9vJsT3oaYhSpDCE9RPocOEQvwsHsFReW2nUEc6OLLyoCFFxIb7KkLGsmfakkut/fFdNJYh0xOTbSN8YvLWcqph09XAY2Y/f0AL7vfO1cuCqtkMt8hFrBGWxDdf9CQIDAQAB",
    "name": "Native Messaging Example",
    "version": "1.0",
    "manifest_version": 2,
    "description": "Send a message to a native application.",
    "browser_action": 
    "default_title": "Test Extension",
    "default_popup": "main.html"
    ,
    "icons": 
    "128": "icon-128.png"
    ,
    "permissions": [
    "nativeMessaging"
    ]

com.google.chrome.example.echo-win.json


    "name": "com.google.chrome.example.echo",
    "description": "Chrome Native Messaging API Example Host",
    "path": "C:\Users\Chriss\Desktop\nativeMessaging\host\native-messaging-example-host.exe",
    "type": "stdio",
    "allowed_origins": [
    "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"
    ]

native-messaging-example-host.exe

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;

JS sn-p(来自http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/nativeMessaging/app/main.js?revision=228976):

function connect() 
    var hostName = "com.google.chrome.example.echo";
    appendMessage("Connecting to native messaging host <b>" + hostName + "</b>")
    port = chrome.runtime.connectNative(hostName);
    port.onMessage.addListener(onNativeMessage);
    port.onDisconnect.addListener(onDisconnected);
    updateUiState();

我无法找出问题所在。我的错在哪里?

更新 在使用 Procces Monitor 监视注册表之后。我发现 chrome.exe 在 64 位密钥中搜索密钥。现在我可以看到没有丢失相关的注册表项,但我仍然收到错误。

【问题讨论】:

【参考方案1】:

我在 Windows 上也遇到过这个问题,但能够让它工作。请尝试以下操作:

关于注册表(我在 HKLM 上,但 HKCU 应该没问题)你应该使用双反斜杠。这是我的 .reg 文件:

[HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\tcchrome.native.handler]
@="G:\\\ExtChrome\\\Extension\\\Native\\\manifest.json"
    保留本机进程的名称,使用小写字母且仅包含 3 个部分 - 表示 com.google.chrome。这听起来很奇怪,但这就是它对我的工作方式...... 将 exe 和清单放在同一个文件夹中,这样路径将是“native-messaging-example-host.exe” - 在这种情况下,我确定是因为我测试过。

这是我的清单,例如:


    "name": "chrome.native.handler",
    "description": "BlaBla helper process",
    "path": "chrome.native.handler.exe",
    "type": "stdio",
    "allowed_origins": [
    "chrome-extension://eoknpfoeckmeidbmbfoklejkppcnlfdm/"
    ]

顺便说一句,您没有正确处理响应。您应该以“本机字节顺序”发送消息长度 - 您正在执行的操作不适用于较大的消息。相反,您可以执行以下操作:

cout.write((char*)&resSize, 4);
cout.write(responseBuf, resSize);

希望对你有帮助

【讨论】:

感谢您的帮助! manifest.json中的绝对路径字符串导致的问题。 请帮助为什么这不起作用但你的工作? ***.com/q/26021106/285594 亲爱的@Spike0xff我有一个问题:Native Messaging 的类型是什么?它是 chrome 应用程序还是扩展程序?

以上是关于Windows 上的 Chrome 原生消息传递的主要内容,如果未能解决你的问题,请参考以下文章

带有 Chrome 原生消息的 C# 原生主机

如何在 chrome 扩展本机消息传递和 c# 应用程序之间发送/接收消息

Chrome 扩展程序:无法启动本机消息传递主机

为 Chrome 扩展指定本机消息传递主机

Chrome 消息传递机制

如何将 Azure 通知 REST API 与 Google 云消息传递一起使用