进程间管道通信,有时会出现部分中文乱码,谁有经验的说说?

雷格 2012-05-28 08:01:01
在vc6.0下,匿名管道通信。

用匿名管道实现进程间同信,类似于QQ聊天界面。两个进程聊天。比如:父进程给子进程发送中文文本。发送文本的时候,一份发送到自己的编辑框控件,一份发送到子进程,然后子进程显示在自己的编辑框中。


可是有时候这个进程说的一句话,在自己这边好好的,到了另一个进程中这句话的最后几个字就变成乱码了。
这是为什么?


...全文
417 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2012-05-28
  • 打赏
  • 举报
回复
我估计接受到的字符最后(或开头)有半个汉字的情况。
schlafenhamster 2012-05-28
  • 打赏
  • 举报
回复
ReadFile(hReadPipe,recestr,50,&byteread,NULL);//recestr是全局变量
后看看接受到什么?
Saleayas 2012-05-28
  • 打赏
  • 举报
回复
不要使用流式传输。
使用消息块。
struct
{
unsigned long _size;
WCHAR _szMessage[1];
};
雷格 2012-05-28
  • 打赏
  • 举报
回复
怎样查看你说的半个汉字的情况 ,你看我的截图可以看出来吗?


我的是本地进程间的匿名管道通信 没涉及到网络

发送代码为
//给子进程发送文本
WriteFile(hWritePipe1,strsend2,strlen(strsend2)+1,&bytewrite,NULL);

[Quote=引用 4 楼 的回复:]

子进程的接收代码为:

memset(recestr,'\0',50);
//读管道
ReadFile(hReadPipe,recestr,50,&byteread,NULL);//recestr是全局变量

//向主窗口发送自定义消息,表示也有数据从管道流过来
SendMessage(*((HWND*)pParam),WM_MYMESSAGE,0,0);

//把文本显示到编辑框
SendMessage (hEdit1, EM_REPLACESEL, 0, (LPARAM)recestr); //向显示框中添加新输入的文本


另一个进程中接受到的汉字有没有半个汉字的情况?
[/Quote]
雷格 2012-05-28
  • 打赏
  • 举报
回复
我没用那个UNICODE编码 本地通信不需要吧。本地管道而已 又不涉及各种协议
[Quote=引用 1 楼 的回复:]

发送文字时,都用unicode编码
[/Quote]
schlafenhamster 2012-05-28
  • 打赏
  • 举报
回复
另一个进程中接受到的汉字有没有半个汉字的情况?
雷格 2012-05-28
  • 打赏
  • 举报
回复
是同样的编码啊 都是在vc6.0下 一起的写的代码 都是默认的编码
[Quote=引用 2 楼 的回复:]

估计数据传错了,应该不是编码的问题,如果两边都用同样的编码
[/Quote]
Lactoferrin 2012-05-28
  • 打赏
  • 举报
回复
估计数据传错了,应该不是编码的问题,如果两边都用同样的编码
ouyh12345 2012-05-28
  • 打赏
  • 举报
回复
发送文字时,都用unicode编码
schlafenhamster 2012-05-28
  • 打赏
  • 举报
回复
手打的:

#define SZ 1
BYTE *KillHalfHZ(BYTE *pData,UINT len)
{
static BYTE HalfHZ=0;
BYTE firstHalf=0;
UINT HalfAt=0;
UINT total=0;
BYTE *copy=0;
BYTE *pTmp=0;
//
if(HalfHZ !=0)
{// add last half HZ to new line
copy=new BYTE[len+1+SZ];
memset(copy,0,len+1+SZ);
copy[0]=HalfHZ;
HalfHZ=0;
memcpy(©[1],pdata,len);
total=len+1;
}
else
{// keep original
copy=new BYTE[len+SZ];
memset(copy,0,len+SZ);
memcpy(copy,pdata,len);
total=len;
}
pTmp=copy;
// check this new line
for(UINT i=0;i<total;i++)
{
if(*pTmp >= 0x80)
{
if(firstHalf==0)
{
firstHalf = *pTmp;
HalfAt = i+1;
}
else
{// has half HZ
if(i == HalfAt)
{// 1 hz
firstHalf=0;
HalfAt=0;
}
else
{// *pTmp='?'
}
}
}
pTmp++;
}
if(HalfAt == 0)
{ // new line no half HZ
copy[total]=0;
}
else if (HalfAt==total)
{// new line has half HZ at end
HalfHZ= firstHalf;
copy[total-1]=0;// sz
}
// delete it after use
return copy;
}
调用时给原读来的数组和长度,返回后直接使用新产生的copy。
BYTE *pstr=KillHalfHZ(pData,len);
replace到edit。
用完delete []pstr
schlafenhamster 2012-05-28
  • 打赏
  • 举报
回复
ReadFile(hReadPipe,recestr,50,&byteread,NULL);//
你这个‘50’有可能把一个汉字分成2个,一个在这行的尾部,另半个在下行头部,
需要一个子程序来鉴别。
雷格 2012-05-28
  • 打赏
  • 举报
回复
不好查看啊 那个是子进程中的变量,而子进程必须要父进程开启, 不知道怎么调试以个程序的子进程啊
[Quote=引用 8 楼 的回复:]

ReadFile(hReadPipe,recestr,50,&byteread,NULL);//recestr是全局变量
后看看接受到什么?
[/Quote]
雷格 2012-05-28
  • 打赏
  • 举报
回复
你是说要指定每次所传输文本的长度?
[Quote=引用 7 楼 的回复:]

不要使用流式传输。
使用消息块。
struct
{
unsigned long _size;
WCHAR _szMessage[1];
};
[/Quote]

15,471

社区成员

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

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