首页
社区
课程
招聘
[求助]通过WM_COYPDATA通信乱码问题
发表于: 2015-3-2 22:11 4833

[求助]通过WM_COYPDATA通信乱码问题

2015-3-2 22:11
4833
网上说在发送时多发送一个字节,可以避免乱码,我加了也是一半的乱码。

发送端

void CSendDlg::OnBnClickedsend()
{
          CWnd *pWnd = CWnd::FindWindow(NULL,L"Receive");
          COPYDATASTRUCT cpd = { 0 };
    CString sCopyData = L"传递的字符串";
   // COPYDATASTRUCT cpd;
    cpd.dwData = 0;
    cpd.cbData = sCopyData.GetLength() + 1;//多加一个长度,防止乱码
    cpd.lpData = (void*)sCopyData.GetBuffer(cpd.cbData);

    pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);
}

接收端

BOOL CReceiveDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
        // AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData),0,0);
         MessageBoxW((LPCTSTR)(pCopyDataStruct->lpData),NULL,0);
        return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}

发送端调试了一下发现,发出的不是乱码,但接收端接到的是乱码。一定是我我接受的方式不对?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
This structure contains data to be passed to another application by the WM_COPYDATA message.

typedef struct tagCOPYDATASTRUCT {
  DWORD dwData;
  DWORD cbData;
  PVOID lpData;
} COPYDATASTRUCT;

Members
dwData
Specifies up to 32 bits of data to be passed to the receiving application.
cbData
Specifies the size, in bytes, of the data pointed to by the lpData member.
lpData
Long pointer to data to be passed to the receiving application. This member can be NULL.
2015-3-3 05:37
0
雪    币: 786
活跃值: (3435)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
3
楼主的代码估计在Unicode模式和非Unicode模式下编译都能通过吧。但是不管哪种模式编译,都存在问题。ansi编译的话,MessageBoxW就不对;unicode编译的话,就像2楼说的,cbData也要转换成byte的长度

cpd.cbData = (sCopyData.GetLength() + 1) * sizeof(TCHAR) ;
cpd.lpData = (void*)(LPCTSTR)sCopyData;
...
MessageBox((LPCTSTR)(pCopyDataStruct->lpData),NULL,0);
...

另外GetBuffer之后要记得ReleaseBuffer,否则可能会出现问题。
2015-3-3 09:11
0
雪    币: 60
活跃值: (444)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
4
大哥你真是大神,不是乱码了!!!
2015-3-3 09:49
0
雪    币: 60
活跃值: (444)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
5
这位哥回答有点深奥,没看懂。
2015-3-3 09:51
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
WM_COPYDATA时如果要发送字符串,也不要把它当做字符串来发送。因为发送的就是一个缓冲区,无论是宽字符还是窄字符,都要按照实际大小来处理(in bytes 而非 in TCHARs)。

怎么发的就怎么收,编码问题自行处理,发得是什么编码,原样收到的就是什么编码。系统不做任何处理。
2015-3-3 11:10
0
雪    币: 2775
活跃值: (1122)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
二楼已经说清楚了,看加红色的部分   in bytes
你传的是字符数,而系统需要的字节数,
所以长度需要*sizeof(TCHAR)
2015-3-6 11:46
0
雪    币: 3496
活跃值: (749)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
mark一下
2015-3-15 08:06
0
游客
登录 | 注册 方可回帖
返回
//