WM_COPYDATAメッセージでバイナリデータの送受信方法

[戻る]
ゴン太 [E-Mail] 2001/10/18(木) 16:27:20
WM_COPYDATAメッセージを用いて、文字列の送信し、受信する方法はわかるのですが、
バイナリデータの送受信方法が分かりません。
文字列にバイナリデータを格納し、文字列として送受信は可能ですが、
NULL(0x00のデータ)が含まれると、それ以降のデータがおかしくなってしまいます。

//送信側のデータ格納例です
int i;
for(i=0;i<16;i++){
    moji[i] = i + 1;
}
moji[10] = 0;
cds.lpData = moji;        


OnCopyData()側は、次のようなコードで受けております。
CString m_str;
m_str = CString((LPCTSTR)pCopyDataStruct->lpData);
//NULL以降の11バイト目以降は受信側で判断が出来なくなってしまいます。

どうぞよろしくお願いいたします。

sugar 2001/10/18(木) 17:03:32
WM_COPYDATAでのデータ転送は、文字列を前提としているわけではありません。
転送するデータのサイズが何バイトなのかを設定するメンバがCOPYDATASTRUCTにあります。
その設定をきちんと行っていますか?

ゴン太 [E-Mail] 2001/10/18(木) 17:36:53
cbDataには、転送データサイズをセットしております。 cdData = 16;
lpDataには、16バイトの以下のバイナリデータが入っております。
{ 1,2,3,4,5,6,7,8,9,10,0,12,13,14,15 };

//受信側は以下のコードです。
OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 

    (CString)m_str = CString((LPCTSTR)pCopyDataStruct->lpData);
    int i;
    char moji[32];
    CString msr;

    strncpy(moji,m_str,16);
    m_str = ""
    for(i=0;i<16;i++){
        msr.Format(_T("%d "),moji[i]);
        m_str = m_str + msr;
    }

以上のコードで、m_str の文字型を表示すると、
"1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0" となってしまします。
もちろん、送信側で11バイト目のデータを(0->11)に変更すると問題ありません。
何がいけないのでしょうか? 
宜しくお願い致します。

Bun 2001/10/18(木) 17:39:29
送られてくるデータが\0でターミネートされていると期待できないのですから
CStringでは受けられないのではないでしょうか?

sugarさんがいわれているように

送信側でcds.cbDataを指定して、受信側ではそのバイト数分だけ
char型のバッファで受信すれば良いのでは?

ゴン太 [E-Mail] 2001/10/18(木) 17:53:31
sugerさん、Bunさん、ご指摘ありがとうございます。
私も、CString型では、無理があるのではないかと、以下のコードで受けようとしたのですが、
どうしてもコンパイルエラーになってしまいます。

char moji[32];
moji = pCopyDataStruct->lpData;

エラー内容:'void *' から 'char[32]' に変換することが出来ません。

色々、キャストしてみたりしたのですがうまくいきません。
どうぞ、宜しくお願いします。

Bun 2001/10/18(木) 18:01:06
char *p = (char*)pCopyDataStruct->lpData;

for (int i = 0; i < pCopyDataStruct->cbData; i++) {
  moji[i] = *(p + i);
}

さっと書いたのでバグっていたらゴメンナサイ。
これでどーでしょ。

ゴン太 [E-Mail] 2001/10/18(木) 18:17:06
[[解決]]
sugerさん、Bunさん、色々とありがとうございました。
おかげ様で、バイナリデータをうまく送受信できるようになりました。
また、宜しくお願いいたします。

kazuma 2001/10/18(木) 21:39:36
memcpy を使うといいです。

ゴン太 2001/10/19(金) 18:13:28
[[解決]]
kazumaさん、ありがとうございます。
そうですネ。 memcopy の手もありました。
使用してみます。
自分も、皆さんの質問に答えられる位のテクを
早く身に付けたいと思っています。
それまで、宜しくお願いします。

古いスレッドには追加発言できません。