获取“与本机消息传递主机通信时出错”。从本机主机向浏览器扩展发送消息时(Windows)

时间:2015-02-10 19:05:55

标签: google-chrome winapi c++11 google-chrome-extension chrome-native-messaging

我得到一个" Inside onDisconnected():与本机消息传递主机通信时出错。"从我的本机主机应用程序向浏览器扩展程序发送消息时。

有几件事可能导致这种情况:

1)在消息开头发送的长度不正确,或发送的长度字节的顺序不正确(字节顺序)。

2)在写入之前不要将stdout置于二进制模式(如果stdout处于文本模式,则可以在代码之外添加额外的字节)。

3)不在UTF-8中将消息作为有效的json发送。实际上,我不确定无效的json会被拒绝,但是文档说消息应该是json。

代码是:

int nStdOutDescriptor = _fileno(stdout);
int result = _setmode( nStdOutDescriptor, _O_BINARY );

if( result == -1 )
{
    OutputDebugStringA ("Failed attempting to set stdout to binary mode\r\n");
    return;
}

HANDLE hStdOut = (HANDLE) _get_osfhandle(nStdOutDescriptor);

if (INVALID_HANDLE_VALUE != hStdOut)
{
    char *results = "{\"results\":\"0000\"}";
    std::string sMsg(results);

    int nMsgLen = sMsg.length();  

    unsigned char first = (unsigned char)(nMsgLen & 0x000000ff);
    unsigned char second = (unsigned char)((nMsgLen >> 8) & 0x000000ff);
    unsigned char third = (unsigned char)((nMsgLen >> 16) & 0x000000ff);
    unsigned char fourth = (unsigned char)((nMsgLen >> 24) & 0x000000ff);

    char *bufMsg = new char[4 + nMsgLen]; // allocate message buffer
    const char *pMessageBytes = sMsg.c_str();
    memcpy( &bufMsg[4], &pMessageBytes[0], nMsgLen);
    bufMsg[0] = first;
    bufMsg[1] = second;
    bufMsg[2] = third;
    bufMsg[3] = fourth;

    DWORD dwNumBytesToWrite = nMsgLen + 4;
    DWORD dwNumBytesWritten;
    if (TRUE == WriteFile(hStdOut, (LPVOID)pMessageBytes, dwNumBytesToWrite, &dwNumBytesWritten, NULL))
    {
        BTrace (L"WriteFile() succeeded. Returned TRUE. %lu bytes written", dwNumBytesWritten );
    }

    _close(nStdOutDescriptor);
}

所有三种可能的原因似乎都没有发生。但我无法发现任何有关导致我的特定错误消息的详细信息(即使是查看Google提供的来源)。 WriteFile()成功,写入的字节数为22个字节。写入总共22个字节,其中4个是长度字节。我已经验证了前4个字节是(十进制,而不是十六进制):18,0,0,0以little-endian方式表示构成json消息的后续字节数。当我使用DebugView来查看我的json消息时,它总是:{"结果":" 0000"}。这是18个字节/字符。我甚至尝试过发送转义双引号,以防首选。在浏览器扩展程序的后台页面中,我调用onDisconnected()事件,该事件报告上一个chrome运行时错误消息(我在哪里获得定义此问题的错误信息)。这意味着正在关闭扩展和本机主机应用程序之间的连接。非常感谢帮助。

1 个答案:

答案 0 :(得分:2)

你应该使用带有WriteFile的bufMsg。您正在使用pMessageBytes,它只是发送字符串而不是长度前缀。

您还应该考虑在WriteFile调用之后使用FlushFileBuffers,因为作为一般规则,您将希望立即发送您的本机应用程序通信。