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バイト目以降は受信側で判断が出来なくなってしまいます。
どうぞよろしくお願いいたします。
WM_COPYDATAでのデータ転送は、文字列を前提としているわけではありません。
転送するデータのサイズが何バイトなのかを設定するメンバがCOPYDATASTRUCTにあります。
その設定をきちんと行っていますか?
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)に変更すると問題ありません。
何がいけないのでしょうか?
宜しくお願い致します。
送られてくるデータが\0でターミネートされていると期待できないのですから
CStringでは受けられないのではないでしょうか?
sugarさんがいわれているように
送信側でcds.cbDataを指定して、受信側ではそのバイト数分だけ
char型のバッファで受信すれば良いのでは?
sugerさん、Bunさん、ご指摘ありがとうございます。
私も、CString型では、無理があるのではないかと、以下のコードで受けようとしたのですが、
どうしてもコンパイルエラーになってしまいます。
char moji[32];
moji = pCopyDataStruct->lpData;
エラー内容:'void *' から 'char[32]' に変換することが出来ません。
色々、キャストしてみたりしたのですがうまくいきません。
どうぞ、宜しくお願いします。
char *p = (char*)pCopyDataStruct->lpData;
for (int i = 0; i < pCopyDataStruct->cbData; i++) {
moji[i] = *(p + i);
}
さっと書いたのでバグっていたらゴメンナサイ。
これでどーでしょ。
sugerさん、Bunさん、色々とありがとうございました。
おかげ様で、バイナリデータをうまく送受信できるようになりました。
また、宜しくお願いいたします。
memcpy を使うといいです。
kazumaさん、ありがとうございます。
そうですネ。 memcopy の手もありました。
使用してみます。
自分も、皆さんの質問に答えられる位のテクを
早く身に付けたいと思っています。
それまで、宜しくお願いします。