2013-08-08 17 views
10

Przeczytałem dokumenty, ale nadal nie mogę zrozumieć. Mam aplikację na komputery napisane w rozszerzeniu C i Chrome. Wiem, jak ten komunikat w moim chrome rozszerzenia:Jak wysłać wiadomość z natywnej aplikacji do rozszerzenia Chrome?

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

Co powinienem napisać w mojej aplikacji C, aby wysłać wiadomość do mojego chrom rozszerzenia? Przykłady Python/NodeJS są również odpowiednie.

+1

Czytałaś https://developer.chrome.com/extensions/messaging.html#native-messaging? –

+2

Zrobiłem, i to nie odpowiada na pytanie? –

Odpowiedz

12

Aby macierzysty host przesyłania komunikatów przesłał dane z powrotem do Chrome, musisz najpierw wysłać cztery bajty informacji o długości, a następnie wysłać sformatowaną wiadomość JSON jako ciąg znaków/tablicę znaków.

Poniżej znajdują się dwa przykłady dla C i C++ odpowiednio, które robią to samo na nieco inny sposób.

C Przykład:

#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++ przykład:

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

(. Rzeczywista komunikatu mogą być wysyłane w tym samym czasie, w którym informacje o długości, jest jedynie wyłamany dla jasności)

Tak postępując zgodnie z przykładem OP Chrome, oto jak wypisać komunikat:

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

W rzeczywistości nie ma wymogu używania "text" jako klucza zwróconego przez natywną aplikację do wysyłania wiadomości; to może być cokolwiek.Ciąg JSON przekazany do odbiornika z Twojej natywnej aplikacji do obsługi wiadomości jest konwertowany na obiekt JavaScript.

Na przykład C++ native aplikacji wiadomości, która korzysta z powyższej techniki w połączeniu z jsoncpp (biblioteka C++ JSON), a także analizuje wniosek wysłany do aplikacji, zobacz tutaj: https://github.com/kylehuff/libwebpg/blob/22d4843f41670d4fd7c4cc7ea3cf833edf8f1baf/webpg.cc#L4501

+0

Drogi @kylehuff, chcę użyć C++ dll (winscard.dll) poprzez natywną komunikację dla rozszerzeń przeglądarki Chrome, jednak nie mogłem tego połączenia. Czy można to zrobić za pomocą "natywnego przesyłania wiadomości"? –

1

użyłem funkcji zapisu:

write(1,buf,n); 

buf jest wiadomość, jeśli n jest długość wiadomości Można również użyć printf.

+2

Próbuję rozwiązać ten sam problem. Widzę, jak mogę odebrać wiadomość, ale nie jestem pewien, jak ją wysłać. Czy ten post sugeruje, że wszystko napisane w standardzie będzie przekazywane do dowolnej aplikacji Chrome, która nasłuchuje wiadomości? Moja natywna aplikacja to aplikacja konsoli .Net. Czy to oznacza, że ​​wszystko wysłane do Console.WriteLine zostanie przekazane do Chrome? – Kywillis

+0

@Kywillis na początku byłem również zdezorientowany, a następnie przeczytałem dokumenty wyjaśnione, że używają stdio, ale host musi być zarejestrowany i możesz określić rozszerzenie, z którym zezwolisz na komunikację w pliku manifestu. https://developer.chrome.com/extensions/nativeMessaging – Reem

7

Można spojrzeć tutaj, jest to przykład skrypt Pythona, który wysyła i odbiera wiadomości z rozszerzeniem: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/nativeMessaging/host/native-messaging-example-host?revision=227442

O ile dobrze rozumiem, w celu wysłania wiadomości należy:

  1. zapisu pocieszyć długość wiadomości jako bynary
  2. napisanie trzech \ 0 znaków
  3. pisać wiadomości w postaci zwykłego tekstu

jest to kod C# to nie praca dla mnie:

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

I kod Pythona z powyższego linku:

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

Co ciekawe to wyraźnie nie wysyła trzy \ 0 znaków, ale wydają się pojawiać po wypisaniu pliku struct.pack, nie wiesz, dlaczego ...

Należy również pamiętać, że należy wysłać wiadomość w formacie JSON, w przeciwnym razie nie działa .

+3

Pierwsze 4 bajty to faktycznie i int zawierające długość str w bajtach. Tak więc twoje rozwiązanie zawiedzie, jeśli str przekroczy 256 bajtów. Również możesz chcieć określić kodowanie strumienia wyjściowego do UTF-8, może to być domyślne, ale na wszelki wypadek. – hultqvist

+0

@phq Dzięki za wyjaśnienie! –

Powiązane problemy