Собственный обмен сообщениями в упакованном приложении Google

У меня есть консольное приложение Windows и упакованное приложение Chrome, с которым я пытаюсь установить двустороннюю связь. Я следовал их примеру с приложением Python, но мне не повезло.

Я предпринял следующие шаги:

  1. Создал эту запись в моем реестре в HKEY_LOCAL_MACHINE\SOFTWARE\Google\NativeMessagingHosts: my.app.name : c:\path\to\my.app.name.json

  2. Я создал файл json в этом месте: { "name": "my.app.name", "description": "Chrome Native Messaging API", "path": "c:\path\to\my.app .name\consoleApp.exe", "type": "stdio", "allowed_origins": [ "chrome-extension://offmjeicniagcebcbclkdlkllfibllfh/" ] }

  3. Я добавил следующее в свой упакованный скрипт приложения:

    function connect() {
     var hostName = "my.app.name";
     appendMessage("Connecting to native messaging host <b>" + hostName + "</b>")
     port = chrome.runtime.connectNative(hostName);
     port.onMessage.addListener(onNativeMessage);
     port.onDisconnect.addListener(onDisconnected);        
    }
    
    function appendMessage(text) {
     document.getElementById('messages').innerHTML += "<p>" + text + "</p>";
    }
    
    function onNativeMessage(message) {
      appendMessage("Received message: <b>" + message + "</b>");
    }
    
    function onDisconnected() {
     appendMessage("Failed to connect: " + chrome.runtime.lastError.message);
     port = null;
    }
    

Когда я нажимаю кнопку, которая вызывает функцию подключения, я получаю эту ошибку:

"Указано недопустимое имя собственного узла обмена сообщениями"

Я пытался играть с этим всеми возможными способами, но не так много документации или примеров кода (почти нет). У кого-нибудь есть идеи?

Благодарность


person Kywillis    schedule 08.10.2013    source источник
comment
Комментарий от user3174625: как вы получаете сообщения на C#?   -  person Duncan Jones    schedule 09.01.2014


Ответы (2)


Только что заработало! Попробуйте изменить «путь» на «consoleApp.exe» (со всеми моими предыдущими предложениями) и поместите свое приложение в ту же папку, что и манифест приложения. Затем проверьте диспетчер задач, и вы увидите, что ваш процесс работает. Удачи.

person Aleksey Isakov    schedule 19.10.2013
comment
Это было очень полезно, спасибо. Я также обнаружил, что, насколько я могу судить, существует недокументированное требование относительно соглашения об именах хоста. Мой хост был назван что-то вроде myHostingApplication. Когда я изменил его на my.hosting.application, это начало работать. Google может иметь какие угодно ограничения на соглашения об именах, но когда они не документируют это, они делают жизнь несчастной. - person Kywillis; 05.12.2013
comment
Ты прав. Я изменил свой на com.google.chrome.myexample, и это было одним из положительных изменений. - person Aleksey Isakov; 05.12.2013
comment
Недавно я вернулся к этому для дальнейшего тестирования. Другое требование к имени хоста состоит в том, что оно ДОЛЖНО быть полностью строчным. - person Kywillis; 09.01.2014

Сначала я думаю, что вы пропустили «Chrome» в пути реестра между «Google» и «NativeMessagingHosts». И как я понял, my.app.name должен быть ключом, а не значением. Во всяком случае, мне это не помогло :( Я также создал одинаковые ключи для ключей реестра x64 и x86.

person Aleksey Isakov    schedule 19.10.2013
comment
У меня была аналогичная проблема с этим сообщением об ошибке. Я просмотрел исходники Chromium и обнаружил, что эта ошибка возникает только при нескольких проблемах: 1) не могу найти значение реестра, которое должно указывать на файл манифеста, 2) не могу открыть файл манифеста, 3) могу' t анализировать файл манифеста, 4) имя в манифесте не совпадает, 5) исполняемый файл не является абсолютным (но он МОЖЕТ быть относительным в Windows). Вы можете использовать такие инструменты, как SysInternals ProcMon, чтобы узнать, загружает ли Chrome настройку из реестра, открывает ли ваш файл манифеста и т. д. Мне это помогло;) — у меня была синтаксическая ошибка в файле json манифеста. - person antonone; 28.01.2014