c++程序中关于SendMessage()显示乱码的一个困惑,希望高手帮忙看看

sink_life 2011-12-14 01:35:12
最近在程序设计中用到api SendMessage()函数,出现了乱码的状况,代码如下:

char str[200];
if(connect(Sock,(SOCKADDR *)&SockAddr,sizeof(SockAddr))==0)
{
//连接成功,
sprintf(str,"%s : %d 连接成功\n",IpChar,Param.Port);
}
//向list box发送LB_ADDSTRING显示数据
SendMessage(GetDlgItem(hDlg,IDC_LIST_RST),LB_ADDSTRING,NULL,(LPARAM)str);
我使用的是vs2008编译的,但是运行后listbox中显示乱码。
网上查了一下,有人说用SendMessageA()就可以,自己试了一下确实是这样。可能跟多人都会碰到这个问题,所以拿出来让大家注意一下。

但是拷贝他人的vs2008的工程,同样使用的SendMessage(),却没有出现乱码的现象,求解原因??

只知道原因大概是unicode和iscii的问题,但是具体为什么是一头雾水,希望哪位大哥帮忙看看
...全文
506 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yisikaipu 2011-12-14
  • 打赏
  • 举报
回复
转换成LPARAM再传入SendMessage()当然编译没问题啊

前面都说了,字符集要配套,都要改

char 改成 TCHAR
sprintf 改成 _stprintf
字符串用TEXT括起来,比如"test",改成TEXT("test");

就是写起来麻烦一些
sink_life 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 et214721856 的回复:]
引用 5 楼 sink_life 的回复:

引用 1 楼 et214721856 的回复:
要看你的工程设置了

alt+F7,配置属性 -> 常规 -> 项目默认值 -> 字符集

一般的api后面带A(比如SendMessageA)就表示此函数是ascii版本的,W就为unicode版本的,否则的话就为当前工程的字符设置,比如设置了unicode,则默认就是SendMessag……
[/Quote]
这个么...确实没有提示错误,刚开始用vs2008,可能很多地方没注意到吧
周晓荣 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sink_life 的回复:]

引用 1 楼 et214721856 的回复:
要看你的工程设置了

alt+F7,配置属性 -> 常规 -> 项目默认值 -> 字符集

一般的api后面带A(比如SendMessageA)就表示此函数是ascii版本的,W就为unicode版本的,否则的话就为当前工程的字符设置,比如设置了unicode,则默认就是SendMessageW,即unicode版本


谢谢前辈的……
[/Quote]

char str[200];

因为你发送的字符串是char类型即ascii,而工程却用了unicode(wchar),导致字符串解析出问题

按道理说,如果你工程设置了unicode,那么SendMessage的时候,参数是char会编译出错的,得用wchar才对的呀
yisikaipu 2011-12-14
  • 打赏
  • 举报
回复
配套改用swprintf

或者用_stprintf通用

除非是简单示例,可以少敲些字符而且一目了然,否则统统用unicode版的


sink_life 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 et214721856 的回复:]
要看你的工程设置了

alt+F7,配置属性 -> 常规 -> 项目默认值 -> 字符集

一般的api后面带A(比如SendMessageA)就表示此函数是ascii版本的,W就为unicode版本的,否则的话就为当前工程的字符设置,比如设置了unicode,则默认就是SendMessageW,即unicode版本
[/Quote]

谢谢前辈的回答,我看了配置,自己确实默认为unicode了。还有一个不懂的就是为什么unicode的输出会变成乱码呢?
yisikaipu 2011-12-14
  • 打赏
  • 举报
回复
既然用windows api,那你的程序铁定在windows(至少2000以后)上跑,所以除非是别人的代码你不想改,否则就用unicode版的api,不然的话系统还是在幕后转换为unicode再调用,调用后再转回非unicode给你的
yisikaipu 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 sink_life 的回复:]但是拷贝他人的vs2008的工程,同样使用的SendMessage(),却没有出现乱码的现象,求解原因??[/Quote]

如果你拷贝了整个工程,也就拷贝了其工程属性,字符集在工程属性里设置

如果其字符集为未设置,SendMessage就自动替换为SendMessageA

VS2008默认字符集为Unicode,SendMessage默认替换为SendMessageW
周晓荣 2011-12-14
  • 打赏
  • 举报
回复
要看你的工程设置了

alt+F7,配置属性 -> 常规 -> 项目默认值 -> 字符集

一般的api后面带A(比如SendMessageA)就表示此函数是ascii版本的,W就为unicode版本的,否则的话就为当前工程的字符设置,比如设置了unicode,SendMessage则默认就是SendMessageW,即unicode版本
周晓荣 2011-12-14
  • 打赏
  • 举报
回复
要看你的工程设置了

alt+F7,配置属性 -> 常规 -> 项目默认值 -> 字符集

一般的api后面带A(比如SendMessageA)就表示此函数是ascii版本的,W就为unicode版本的,否则的话就为当前工程的字符设置,比如设置了unicode,则默认就是SendMessageW,即unicode版本

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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