How to send message FROM native app TO Chrome extension?

后端 未结 3 1232
醉话见心
醉话见心 2020-12-03 06:13

I have read docs, but still cannot realize. I have desktop application written in C and Chrome extension. I know how to receive this message in my chrome extension:

相关标签:
3条回答
  • 2020-12-03 06:19

    I used function write:

    write(1,buf,n);
    

    buf is your message, n is length if your message You also can use printf.

    0 讨论(0)
  • 2020-12-03 06:27

    You can take a look here, this is an example python script which sends and receives messages to the extension: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/nativeMessaging/host/native-messaging-example-host?revision=227442

    As far as I understand it, in order to send the message you need to:

    1. write to console the length of the message as bynary
    2. write three \0 characters
    3. write your message in plain text

    this is the C# code that did the job for me:

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

    And the python code from the above link:

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

    Interestingly it doesn't explicitly output the three \0 characters, but they seem to appear after outputting the struct.pack, not sure why...

    Also note that you need to send the message in JSON format, otherwise it doesn't seem to work.

    0 讨论(0)
  • 2020-12-03 06:35

    In order for a native messaging host to send data back to Chrome, you must first send four bytes of length information and then send the JSON formatted message as a string/char-array.

    Below are two examples for C and C++ respectively that do the same thing in slightly different ways.

    C example:

    #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++ example:

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

    (The actual message can be sent at the same time as the length information; it is merely broken out for clarity.)

    So following the OP Chrome example, here is how to output the message:

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

    In reality, there is no requirement to use "text" as the key returned from your native messaging app; it could be anything. The JSON string passed to the listener from your native messaging app is converted to a JavaScript Object.

    For a C++ example of a native messaging app that uses the above technique in combination with jsoncpp (C++ JSON library) and also parses the request sent to the app, see here: https://github.com/kylehuff/libwebpg/blob/22d4843f41670d4fd7c4cc7ea3cf833edf8f1baf/webpg.cc#L4501

    0 讨论(0)
提交回复
热议问题