0

win32のパイプを使用して、あるアプリから別のアプリに* var、つまり実際には4スロットの配列を送信しようとしています。どうすればこれを正しく行うことができますか?

私の知る限り、私はそれを正しくやっています:

    //sending like this:
    if (!WriteFile(hPipeWriteGhosts[i],Ghosts, (DWORD) sizeof(map)*4, &n, NULL)) 
                {  
                    printf("[ERROR] Writing in the pipe... (WriteFile)\n");
                    exit(1);
                }


    //receiving like this
    ret = ReadFile(HReadSPipe, Ghosts, sizeof(map)*4, &n, NULL);   // Lê até ao numero de bytes for zero (pipe fechado) pk o cliente escreveu fim e n escreveu mais nada
        if (!ret || !n)
            MessageBox(hDlgGlobal, str, "Error", MB_YESNO | MB_ICONINFORMATION);  // But in fact it shows me this all the time.

どうすればこれを正しく行うことができますか?

前もって感謝します。

4

2 に答える 2

1

OK、あなたの問題は、プロセスの境界を越えてハンドルとポインターを移動していることです。あなたにはとmapが含まれてchar *HBITMAPます。値を転送char *しますが、それが指すデータは転送しません。ビットマップのハンドルを転送しますが、実際のビットマップは転送しません。

于 2012-06-05T19:55:34.637 に答える
0

構造体マップに含まれる物理データを転送する必要があります。

一般的に、私はパイプを介してデータを転送するためにバイト配列を使用します。構造体やオブジェクトなどのデータ項目の場合、構造体やオブジェクトの個々のデータメンバーをバイト配列にコピーすることをお勧めします。たとえば、構造体をネストしたり、文字列を含む配列や、固定サイズ。次に、パイプのもう一方の端で、バイト配列で受信したデータに基づいて構造体またはオブジェクトを再構築します。intなどの固定サイズを持たないデータの場合、その項目のサイズをバイト配列に書き込み、その後にデータ自体を書き込みます。

また、サーバー側で正しく読み取られていないように見える場合、またはクライアント側で正しく書き込まれていない可能性がある場合は、発生しているランタイムエラーがあれば送信し、宣言と構築の方法も示してください。バッファ変数、ゴースト。たとえば、開始位置ではなく終了バッファ位置を誤って転送していないことを確認しますか?

于 2012-06-12T06:23:09.913 に答える