将数据从Host App发送到Chrome Extension

时间:2015-07-22 13:54:37

标签: c google-chrome-extension google-chrome-devtools chrome-native-messaging

经过几个小时的工作后,我可以在激活扩展程序时运行扩展程序和主机应用程序,但每当我尝试接收数据时,都会得到未定义。

这是我的代码:

int main(int argc, char* argv[]) {
    char message[] = "{\"t\": \"t\"}";

    unsigned int len = strlen(message);
    _setmode(_fileno(stdout), _O_BINARY);

    printf("%c%c%c%c", (char) 10, (char) 0, (char) 0, (char) 0);

    printf("%s", message);

    return 0;
}

我做错了什么?

1 个答案:

答案 0 :(得分:1)

%c需要int个参数(内向unsigned char),而不是char。这可能/将导致打印错误的数据。此外,strlen还会返回size_t。您应该阅读您使用的函数的手册页。

重要提示:传递二进制值(不是字符)时,您应该使用uint8_t或 - 至少unsigned char。请记住,char可以是签名或未签名,具体取决于实现。这可能会导致算术运算出现意外。

注意:

printf("%c%c%c%c", (char) 10, (char) 0, (char) 0, (char) 0);
printf("%s", message);

可以组合(删除演员表):

printf("%c%c%c%c%s", 10, 0, 0, 0, message);

如果没有要支持的库,你应该考虑编写一些函数来序列化一些基本类型,如:

static void print_u32(uint32_t value)
{
    for ( size_t n = 0 ; n < 4 ; n-- ) {
        putc((unsigned char)value);  // still passing an int !
        value >>= 8;
    }
}

... print_string( ...

print_u32(strlen(message));
print_string(message);

请注意,_setmode不是标准库函数。经过一些谷歌搜索后,它似乎也是Windows支持的BSD扩展(以防您希望该扩展程序是可移植的。)