「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);
}
考えられる原因の 3 つすべてが発生していないようです。しかし、特定のエラー メッセージの原因に関する詳細な情報を (Google が提供するソースを見ても) 見つけることができません。WriteFile() は成功し、書き込まれたバイト数は 22 バイトです。合計 22 バイトが書き込まれ、そのうち 4 バイトは長さバイトです。最初の 4 バイトが (16 進数ではなく 10 進数で) 18,0,0,0 であることを確認しました。これは、リトルエンディアン形式で、json メッセージを構成するために続くバイト数を示します。DebugView を使用して json メッセージを確認すると、常に {"results":"0000"} になります。これは 18 バイト/文字です。エスケープされた二重引用符が好まれる場合に備えて、送信することも実験しました。ブラウザの拡張機能で ' s バックグラウンド ページ onDisconnected() イベントが呼び出され、最後の chrome ランタイム エラー メッセージが報告されます (ここで、この質問を定義するエラー メッセージが表示されます)。これは、拡張機能とネイティブ ホスト アプリの間の接続がシャットダウンされていることを意味します。助けていただければ幸いです。