WM_COPYDATAメッセージでバイナリデータの送受信方法 – プログラミング – Home

WM_COPYDATAメッセージでバイ...
 
通知
すべてクリア

[解決済] WM_COPYDATAメッセージでバイナリデータの送受信方法


ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 23年前
投稿: 4
Topic starter  

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
 sugar
(@sugar)
ゲスト
結合: 23年前
投稿: 448
 

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


返信引用
ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 23年前
投稿: 1
 

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
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

送られてくるデータが\0でターミネートされていると期待できないのですから
CStringでは受けられないのではないでしょうか?

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

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


返信引用
ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 23年前
投稿: 4
Topic starter  

sugerさん、Bunさん、ご指摘ありがとうございます。
私も、CString型では、無理があるのではないかと、以下のコードで受けようとしたのですが、
どうしてもコンパイルエラーになってしまいます。

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

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

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


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

char *p = (char*)pCopyDataStruct->lpData;

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

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


返信引用
ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 23年前
投稿: 4
Topic starter  

sugerさん、Bunさん、色々とありがとうございました。
おかげ様で、バイナリデータをうまく送受信できるようになりました。
また、宜しくお願いいたします。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 23年前
投稿: 217
 

memcpy を使うといいです。


返信引用
ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 23年前
投稿: 18
 

kazumaさん、ありがとうございます。
そうですネ。 memcopy の手もありました。
使用してみます。
自分も、皆さんの質問に答えられる位のテクを
早く身に付けたいと思っています。
それまで、宜しくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました