Родное приложение не работает в расширении Chrome

Я пытаюсь использовать Chrome Native Messaging API для расширения Chrome.

Manifest.json для нативного приложения:

{
  "name": "app.native",
  "description": "Native Message API Test.",
  "path": "native.exe",
  "type": "stdio",
  "allowed_origins": ["chrome-extension://kembignchdjhopkkcolnamikcenaocdm/"]
}

Значение реестра Windows:

HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\app.native=D:\connectNative\manifest.json

Я также пробовал D:\\\\connectNative\\\\manifest.json

И я добавляю «nativeMessaging» к «разрешениям» в расширении Chrome manifest.json.

Нативная цена за клик для приложения:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main(int argc, char* argv[]) {
    string input = "";
    string message="{\"text\": \"This is a response message\",\"num\": \"three\"}";
    unsigned int len = message.length();
    cout << char(((len>>0) & 0xFF))
         << char(((len>>8) & 0xFF))
         << char(((len>>16) & 0xFF))
         << char(((len>>24) & 0xFF));
    cout << message <<endl;
    getline(cin, input);
    cout << "You entered: " << input << endl;
    ofstream myfile;
    myfile.open ("example.txt");
    myfile << "Writing this to a file.\n";
    myfile << input;
    myfile.close();

    return 0;
}

После того, как все сделано, я пробую в своем расширении Chrome:

var testport = chrome.runtime.connectNative('app.native');
testport.onMessage.addListener(function(msg) {
    console.log("Received" + msg);
});
testport.onDisconnect.addListener(function() {
  console.log("Disconnected");
});

Он не может получать никаких сообщений и всегда печатает «Отключено».

Я пытаюсь подключиться к несуществующему приложению, оно все еще печатает «Отключено», поэтому я знаю, что это родное приложение настроено неправильно.

Может ли кто-нибудь указать, что не так или что я пропустил?


person Leslie Wu    schedule 24.01.2014    source источник
comment
Вы не сказали, где находится native.exe. Это в D:\connectNative\native.exe?   -  person sowbug    schedule 25.01.2014
comment
Да, я пробовал и относительный, и абсолютный путь к native.exe, оба не работают.   -  person Leslie Wu    schedule 26.01.2014
comment
Я думаю, что проблема связана с записью в реестре: это содержимое моего файла .reg: Редактор реестра Windows версии 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.windows.screen] @=C:\\Users\\abc\ \Рабочий стол\\Расширение Chrome\\manifest.json   -  person rohitvk    schedule 03.02.2014
comment
также ваше собственное приложение не отправляет правильный заголовок. обратитесь к этому вопросу для лучшей реализации. stackoverflow.com/questions/21452483/   -  person FuzzyAmi    schedule 03.07.2014


Ответы (2)


По умолчанию cout является текстовым потоком, отправка нулевого значения (это происходит как часть вашего размера первых 4 байтов) завершает ваш текстовый поток раньше.

В Windows вы можете обновить cout до двоичного, изменив базовый стандартный вывод, и не забудьте сбросить...

_setmode(_fileno(stdout), _O_BINARY);   
int len = msg.length();
std::cout << char(len >> 0)
  << char(len >> 8)
  << char(len >> 16)
  << char(len >> 24);

std::cout << msg << std::flush;
person Greg Domjan    schedule 11.05.2016

Пример рабочего скрипта с Native reference. Обратите внимание на разрешения для nativeMessaging и отсутствие прямой ссылки на внешний ресурс в Manifest.json, ссылка будет позже в сценарии .js.

{
   "background": {
      "scripts": [ "common.js", "filler.js",  "background.js" ]
   },
   "browser_action": {
      "default_icon": "r.png",
      "default_title": "Click this button to show commands"
   },
   "content_scripts": [ {
      "all_frames": true,
      "js": [ "common.js", "content.js", "filler.js" ],
      "matches": [ "http://*/*", "https://*/*", "file:///*" ],
      "run_at": "document_start"
   } ],
   "description": "For Google Chrome",
   "homepage_url": "http://www.app.com",
   "icons": {
      "128": "r.png",
      "16": "r.png",
      "32": "r.png",
      "48": "r.png"
   },
   "key": "???",
   "manifest_version": 2,
   "name": "???",
   "options_page": "options.html",
   "permissions": [ "tabs", "bookmarks", "webRequest", "webRequestBlocking", "nativeMessaging", "downloads", "http://*/*", "https://*/*" ],
   "update_url": "https://clients2.google.com/???/",
   "version": "???"
}
person Mr.Deek    schedule 26.04.2014