3

「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 ランタイム エラー メッセージが報告されます (ここで、この質問を定義するエラー メッセージが表示されます)。これは、拡張機能とネイティブ ホスト アプリの間の接続がシャットダウンされていることを意味します。助けていただければ幸いです。

4

1 に答える 1

2

WriteFile で bufMsg を使用する必要があります。長さのプレフィックスではなく、文字列を送信するだけの pMessageBytes を使用しています。

一般的なルールとして、ネイティブ アプリの通信をすぐに送信する必要があるため、WriteFile 呼び出しの後に FlushFileBuffers を使用することも検討する必要があります。

于 2015-02-10T21:39:35.007 に答える