6

Ich denke, es ist schon Antwort wartete, aber nicht sicher: Native app does not work in Chrome extension
Unter Linux es gut funktioniert, aber auf Windows 7 und 8 habe ich immer eine Fehlermeldung erhalten "Angegebene nativen Messaging-Host nicht gefunden ".Chrome nativen Messaging auf Windows

Das ist mein Registry (I bereits mit doppelten Backslash und mit HKEY_LOCAL_MACHINE versucht haben):

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 


manifest.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/" 
    ] 
} 


einheitliche 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 Schnipsel (es ist von 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(); 
} 

Ich kann nicht herausfinden, was das Problem ist. Wo ist meine Schuld?

Aktualisierung
Nach der Überwachung der Registrierungen mit Procces Monitor. Ich habe festgestellt, dass die chrome.exe nach dem Schlüssel in den 64-Bit-Schlüsseln sucht. Jetzt, wie ich sehen kann, gibt es keinen relevanten Registrierungsschlüssel, aber ich bekomme immer noch den Fehler.

Antwort

5

Ich habe auch mit diesem Problem auf Windows gekämpft, aber war in der Lage, es zum Laufen zu bringen. Versuchen Sie Folgendes:

In Bezug auf die Registrierung (meine auf der HKLM, aber HKCU sollte OK sein) sollten Sie doppelte Backslash verwenden. Hier ist meine REG-Datei:

[HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\tcchrome.native.handler] 
@="G:\\\ExtChrome\\\Extension\\\Native\\\manifest.json" 
  1. Halten Sie den Namen des nativen Prozesses mit Kleinbuchstaben und nur 3 Teile - also com.google.chrome. Es klingt seltsam, aber das ist, wie es für mich funktioniert ...
  2. Setzen Sie die exe und das Manifest in den gleichen Ordner, so dass der Pfad wird "native-messaging-example-host.exe" - In diesem Fall ich bin sicher, weil ich es getestet habe.

Hier ist mein Manifest zum Beispiel:

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

BTW, Sie haben Recht, die Antwort nicht handhaben. Sie sollten die Nachrichtenlänge in "nativer Byte-Reihenfolge" senden - was Sie tun, wird für größere Nachrichten nicht funktionieren.Stattdessen können Sie so etwas wie zu tun:

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

hoffe, das hilft

+0

Vielen Dank für Ihre Hilfe! Das Problem, das von der absoluten Pfadzeichenfolge in der Datei manifest.json verursacht wird. – Chriksz

+0

Bitte helfen Sie, warum das nicht funktioniert, aber Sie arbeiten? http://StackOverflow.com/Q/26021106/285594 – YumYumYum

+0

Sehr geehrte @ Spike0xffIch habe eine Frage: Was ist die Art der Native Messaging? es ist eine Chrome App oder eine Erweiterung? –