【问题标题】:How to use Native Host Message in Native Application For Chrome Native Messaging Extension如何在原生应用程序中为 Chrome 原生消息扩展使用原生主机消息
【发布时间】:2015-01-29 10:57:01
【问题描述】:

我正在开发带有本地主机消息传递的 Chrome 扩展程序。我无法在我的主机应用程序中使用消息文本。从建立连接到在扩展中获得响应,一切正常。 我需要在我的应用程序中使用消息文本,以便在简单文本数据类型(字符串/字符)中进一步使用/执行。我知道消息是 UTF8 编码的形式,我尝试解码但仍然遇到问题,有人可以帮我吗?

当我解码消息时,chrome 扩展控制台显示错误:“与本机消息传递主机通信时出错。”如果我在“cout”之后使用该消息文本,同样的错误是否存在“与本机消息传递主机通信时出错”。直接发送和接收消息对我来说很好。

代码是这样的:

 std::string mycode(std::string data){
    data= data+"abc"; //changing text to any thing.
    cout<< data;
    anotherFunction(data);//killing processes using string data
}
int main(int argc, char* argv[])
{
    std::cout.setf( std::ios_base::unitbuf );
    while (true)
    {
        unsigned int ch, inMsgLen = 0, outMsgLen = 0;
        std::string input = "", response = "";
        std::cin.read((char*)&inMsgLen, 4);
        if (inMsgLen == 0)
        {
            break;
        }
        else
        {
            for (int i=0; i < inMsgLen; i++)
            {
                ch = getchar();
                input += ch;
            }
        }
        response.append("{\"echo\":").append(input).append("}");
        outMsgLen = response.length();
        std::cout.write((char*)&outMsgLen, 4);
        std::cout << response;
        cout<< input;
        //using "input" variable for further user 
        mycode(input);
    }
    return 0;
}

【问题讨论】:

  • 消息是 UTF8 是什么意思?传递给本机消息传递主机的消息是二进制模式,您需要将标准输入设置为二进制,读取前 4 个字节知道消息的大小,然后读取消息。
  • 我也在做同样的事情,读取前 4 个字节以了解消息的大小,然后读取消息。但是当我使用消息文本进一步使用时,chrome 扩展日志显示错误“与本机消息传递主机通信时出错”。
  • 发布你的交流c++代码。
  • 请检查我分享了下面的代码。 @JoãoAugusto

标签: c++ google-chrome google-chrome-extension utf8-decode chrome-native-messaging


【解决方案1】:

错了,你读过文档吗? 试试这样的...

_setmode( _fileno( stdin ), _O_BINARY ); 
    _setmode( _fileno( stdout ), _O_BINARY ); 

    char cBuffer[65536] = {0}; 
    while(true)
    {       
        unsigned int uiSize = 0;                        
        std::cin.read((char*)&uiSize, sizeof(unsigned int));

        if(uiSize != 0 && uiSize < 65536)
        {                       
            memset(cBuffer, 0, 65536);
            std::cin.read(cBuffer, uiSize);

            std::string strIn(cBuffer);

            std::string strOut = "{\"result\":\"This is a Test\"}";                 
            uiSize = strOut.length();

            std::cout << char(((uiSize>>0) & 0xFF));
            std::cout << char(((uiSize>>8) & 0xFF));
            std::cout << char(((uiSize>>16) & 0xFF));
            std::cout << char(((uiSize>>24) & 0xFF));   
            std::cout << strOut.c_str();                
        }
        else
            break;
    }

您需要将 io 设置为二进制,否则可能会发生这种情况... 如果存在值为 00011010 (CTRL ALT Z = 26) 的字节,它将被视为 EOF 并结束通信。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多