我收到“内部 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 消息时,它总是:{“results”:“0000”}。那是 18 个字节/字符。我什至尝试过发送转义的双引号,以防万一。在浏览器扩展中' s 背景页面我的 onDisconnected() 事件被调用,它报告最后一个 chrome 运行时错误消息(这就是我得到定义这个问题的错误消息的地方)。这意味着扩展程序和本机主机应用程序之间的连接正在关闭。帮助将不胜感激。