2013-08-08 11 views
10

Ich habe Dokumente gelesen, kann aber immer noch nicht realisieren. Ich habe Desktop-Anwendung in C und Chrome-Erweiterung geschrieben. Ich weiß, wie diese Nachricht in meinem Chrome-Erweiterung erhalten:So senden Sie eine Nachricht von der nativen App an die Chrome-Erweiterung?

port.onMessage.addListener(function(msg) { 
    console.log("Received" + msg); 
}); 

Was soll ich in meiner C-Anwendung schreiben Sie eine Nachricht an meine Chrome-Erweiterung zu schicken? Python/NodeJS Beispiele sind ebenfalls geeignet.

+1

Lasen Sie https://developer.chrome.com/extensions/messaging.html#native-messaging? –

+2

Ich tat, und es beantwortet nicht die Frage? –

Antwort

12

Damit ein nativer Nachrichtenhost Daten zurück an Chrome senden kann, müssen Sie zunächst vier Byte mit Längeninformationen senden und dann die JSON-formatierte Nachricht als String/Char-Array senden.

Im Folgenden sind zwei Beispiele für C bzw. C++, die auf eine etwas andere Art dasselbe tun.

C Beispiel:

#include <stdio.h> 
#include <string.h> 

int main(int argc, char* argv[]) { 
    // Define our message 
    char message[] = "{\"text\": \"This is a response message\"}"; 
    // Collect the length of the message 
    unsigned int len = strlen(message); 
    // We need to send the 4 bytes of length information 
    printf("%c%c%c%c", (char) (len & 0xff), 
         (char) ((len>>8) & 0xFF), 
         (char) ((len>>16) & 0xFF), 
         (char) ((len>>24) & 0xFF)); 
    // Now we can output our message 
    printf("%s", message); 
    return 0; 
} 

C++ Beispiel:

#include <string.h> 

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; 
} 

(. Die eigentliche Nachricht kann zur gleichen Zeit wie die Längeninformationen gesendet werden, sondern lediglich der Übersichtlichkeit halber herausgebrochen ist)

So folgen Sie dem OP Chrome Beispiel, hier ist, wie man die Nachricht ausgibt:

port.onMessage.addListener(function(msg) { 
    console.log("Received" + msg.text); 
}); 

In Wirklichkeit ist es nicht erforderlich, "text" als Schlüssel zu verwenden, der von Ihrer nativen Messaging-App zurückgegeben wird. es könnte alles sein.Die JSON-Zeichenfolge, die von Ihrer nativen Messaging-App an den Listener übergeben wird, wird in ein JavaScript-Objekt konvertiert.

für ein C++ Beispiel einer nativen Messaging-Anwendung, die die oben beschriebene Technik in Kombination mit jsoncpp (C++ JSON-Bibliothek) und auch die Anforderung an die App gesendet parst verwendet, finden Sie hier: https://github.com/kylehuff/libwebpg/blob/22d4843f41670d4fd7c4cc7ea3cf833edf8f1baf/webpg.cc#L4501

+0

Sehr geehrte @ kylehuff, ich möchte eine C++ - DLL (winscard.dll) über native Messaging für Chrome-Browser-Erweiterungen verwenden, jedoch konnte ich diese Verbindung nicht herstellen. Ist es möglich, diese Kommunikation über "Native Messaging" zu machen? –

1

Ich benutzte Funktion Schreib:

write(1,buf,n); 

buf ist Ihre Nachricht, n ist die Länge, wenn Sie Ihre Nachricht Sie können auch printf verwenden.

+2

Ich versuche, das gleiche Problem zu lösen. Ich sehe, wie ich die Nachricht erhalten kann, aber ich weiß nicht, wie ich sie senden soll. Bedeutet dieser Beitrag, dass alles, was in Standard Out geschrieben wurde, an eine Chrome-App weitergegeben wird, die auf Nachrichten wartet? Meine native App ist eine .Net-Konsolenanwendung. Bedeutet das, dass irgendetwas an Console gesendet wird? WriteLine würde dann an Chrome weitergeleitet werden? – Kywillis

+0

@Kywillis zuerst war ich auch verwirrt dann das Lesen der Dokumente erklärte, dass es das stdio verwendet, aber der Host muss registriert werden, und Sie können die Erweiterung angeben, die Kommunikation in der Manifest-Datei ermöglichen. https://developer.chrome.com/extensions/nativeMessaging – Reem

7

Sie hier einen Blick darauf werfen können, ist dies ein Beispiel Python-Skript, das und empfängt Nachrichten an die Erweiterung sendet: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/nativeMessaging/host/native-messaging-example-host?revision=227442

Soweit ich es verstehe, um die Nachricht, die Sie benötigen zu senden:

  1. schreiben zu trösten, die Länge der Nachricht als bynary
  2. Schreib drei \ 0 Zeichen
  3. schreiben Sie Ihre Nachricht im Klartext

dies ist der C# -Code, der die Arbeit für mich getan hat:

String str = "{\"text\": \"testmessage\"}"; 

Stream stdout = Console.OpenStandardOutput(); 

stdout.WriteByte((byte)str.Length); 
stdout.WriteByte((byte)'\0'); 
stdout.WriteByte((byte)'\0'); 
stdout.WriteByte((byte)'\0'); 
Console.Write(str); 

Und der Python-Code aus dem obigen Link:

sys.stdout.write(struct.pack('I', len(message))) 
sys.stdout.write(message) 
sys.stdout.flush() 

Interessanter tut es nicht explizit ausgegeben die drei \ 0 Zeichen, aber sie scheinen nach der Ausgabe der struct.pack, nicht sicher, warum erscheinen ...

Beachten Sie auch, dass Sie die Nachricht im JSON-Format senden müssen, sonst scheint es nicht zu funktionieren .

+3

Die ersten 4 Bytes sind tatsächlich und int enthalten die Str Länge in Bytes. Daher wird Ihre Lösung fehlschlagen, wenn str über 256 Bytes hinausgeht. Auch möchten Sie vielleicht die Ausgabe-Stream-Codierung zu UTF-8 angeben, könnte es die Standardeinstellung aber nur für den Fall sein. – hultqvist

+0

@phq Danke für die Klarstellung! –

Verwandte Themen