跨系统两进程通信copydata接收显示乱码

绿豆蛙2013 2013-11-18 04:08:21
待发送字符串:京A0000000
发送端(win7,VC2008开发,运行xp):
			LRESULT copyDataResult;

CWnd *pOtherWnd = CWnd::FindWindow(NULL,_T("XXXXXXX"));
if (pOtherWnd)
{
COPYDATASTRUCT cpd;
cpd.dwData = 0;
cpd.cbData = outToLEDstr.GetLength();
cpd.lpData = (void *)outToLEDstr.GetBuffer(cpd.cbData);
copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,
(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),
(LPARAM)&cpd);
outToLEDstr.ReleaseBuffer();

}

接收端(xp,VC6开发,运行xp):
接收到的结果:王希A
BOOL CLED2Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{
// TODO: Add your message handler code here and/or call default
CString s =(LPCTSTR)(pCopyDataStruct->lpData);
::AfxMessageBox(s);
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}


也试过添加_UNICODE,UNICODE,不起作用
...全文
203 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bsnry 2013-11-19
  • 打赏
  • 举报
回复
引用 7 楼 xiaohuh421 的回复:
那是你替换错地方了. VS的话, 是在项目属性-->配置属性-->常规-->字符集 中修改. VC6.0好久没用了, 也没安装, 不对, 那肯定是设置错了. 如果你弄不清字符集, 也不好弄环境, 可以强制使用宽字符. CStringW 接收发送都统一使用.
学习了, 又复习了一遍wm_copydata用法
xiaohuh421 2013-11-19
  • 打赏
  • 举报
回复
那是你替换错地方了. VS的话, 是在项目属性-->配置属性-->常规-->字符集 中修改. VC6.0好久没用了, 也没安装, 不对, 那肯定是设置错了. 如果你弄不清字符集, 也不好弄环境, 可以强制使用宽字符. CStringW 接收发送都统一使用.
绿豆蛙2013 2013-11-18
  • 打赏
  • 举报
回复
引用 5 楼 xiaohuh421 的回复:
cbData Specifies the size, in bytes, of the data pointed to by the lpData member. 注意这个成员是字节数, 不是字符数. 应该写成: cpd.cbData = outToLEDstr.GetLength()*sizeof(TCHAR); 当然, 你在多字符集下, 你的程序没有问题. 你说的乱码问题, 还有看你描述的同一个编译器就没有问题, 那就说明肯定是字符集不同了. 因为VC6.0默认是ASCII, 而VS2008默认是UNICODE.
我也觉得是字符集的问题,可是把UNICODE,_UNICODE替换掉了_MBCS没效果
xiaohuh421 2013-11-18
  • 打赏
  • 举报
回复
cbData Specifies the size, in bytes, of the data pointed to by the lpData member. 注意这个成员是字节数, 不是字符数. 应该写成: cpd.cbData = outToLEDstr.GetLength()*sizeof(TCHAR); 当然, 你在多字符集下, 你的程序没有问题. 你说的乱码问题, 还有看你描述的同一个编译器就没有问题, 那就说明肯定是字符集不同了. 因为VC6.0默认是ASCII, 而VS2008默认是UNICODE.
绿豆蛙2013 2013-11-18
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
其它进程访问不到你进程中的空间 用 GlobalAlloc( GPTR|GMEM_SHARE 分配内存块做数据区,
那为什么接收端和发送端都用VS2008来编译,就没问题呢?好像不是进程调用的问题。 你说的UNICODE和非UNICODE,我也在VC6工程-》设置中用UNICODE,_UNICODE替换掉了_MBCS,没有效果,不过好像还是宽字节的问题,比如我读每一位,京A00000 a[0]='王希' a[1]='NA' a[2]='A' a[3]='' a[4]='0' a[5]='' a[6]='0' a[7]='' a[8]='0' a[9]='' a[10]='0' .....
zgl7903 2013-11-18
  • 打赏
  • 举报
回复
还需要注意UNICODE和非UNICODE
zgl7903 2013-11-18
  • 打赏
  • 举报
回复
其它进程访问不到你进程中的空间 用 GlobalAlloc( GPTR|GMEM_SHARE 分配内存块做数据区,
绿豆蛙2013 2013-11-18
  • 打赏
  • 举报
回复
调试发现,与操作系统无关,如果两个都用VC6或都用VC2008都能正常显示,发送接收用的不是同一个编译器就会出现这种情况

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧