进程间的消息传递(CString值传递)

flyskytoday 2009-11-12 10:40:33
两个程序间的CString传递
我是这样的,接收是乱码

发送端(vc6编译)
CString kk="http://123abc";
::SendMessage(hwnd,WM_USER+1,0,(LPARAM)&kk);

接收端(vc9编译)
CString *sUrl= (CString*)lparam;
MessageBox(*sUrl);//这里全是乱码,为什么不显示http://123abc

在网上搜索了一下帖子好象也没找到好的解决方法~
...全文
545 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyskytoday 2009-11-13
  • 打赏
  • 举报
回复
谢谢大家,还是改用其他通信方式
结贴
jameshooo 2009-11-12
  • 打赏
  • 举报
回复
WM_USER以内的系统消息可以安全地传递指针,因为所有参数的内容都是系统已知的,指针类型的参数会被系统列集,但大于WM_USER的自定义消息不能跨进程传递指针(对SendMessage来说指针只是一个无意义的整数值)。

还是楼上各位的解决方案:管道、共享内存、WM_COPYDATA都是可行的解决方案。
vincent_1011 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 flyskytoday 的回复:]
但我奇怪,,,为什么在两个进程间(WPARAM wParam, LPARAM lParam)这两个参数,传递整数就可以呢?而且接收端也正确
[/Quote]

和你这个不冲突。。

其实你指针也是传过去了,当你把这个指针当是整形数用的时候就正确。

当是你当指针用的时候,你需要的是这个指针里面的内容,而不是指针的本身。所以出错

所以我大胆假设,你在发送端把指针本身的值打印出来,然后在接收端也把接收到的值打印出来。

我个人认为是一样的
WaistCoat13 2009-11-12
  • 打赏
  • 举报
回复
整数可以直接通过Buffer传递过去的,因为是基本类型长度可知。

字符串不行的,因为这个长度不定,不能这么传
gg606 2009-11-12
  • 打赏
  • 举报
回复
有两个问题:1、如楼上指出,进程发送消息,参数要用共享内存。
2、跨进程传递自定义消息,不能简单地定义为 WM_USER+1 这样,要用注册的方式来保证该消息的唯一性。

其实你这个用 WM_COPYDATA 消息来传就好了,它内建有共享内存机制。
flyskytoday 2009-11-12
  • 打赏
  • 举报
回复
但我奇怪,,,为什么在两个进程间(WPARAM wParam, LPARAM lParam)这两个参数,传递整数就可以呢?而且接收端也正确
vincent_1011 2009-11-12
  • 打赏
  • 举报
回复
难道楼主以前不是搞C++的?

四星了啊你
flyskytoday 2009-11-12
  • 打赏
  • 举报
回复
好象是这个道理,,,不同进程间的地址是不能共享的
要是用管道觉得麻烦
或是内存共享也没有这个消息传递行简单~
[Quote=引用 7 楼 muzizongheng 的回复:]
是这样的,
你传的是字符指针, 而这个内存地址呢是不会在进程间共享的, 也就是说你传时的地址, 在你接收方的内存地址不一定是同样的字符啊.

因此不能这样来.
[/Quote]
muzizongheng 2009-11-12
  • 打赏
  • 举报
回复
因此不能传指针类型的, 只能传 整型方面的
flyskytoday 2009-11-12
  • 打赏
  • 举报
回复
这样不行地,出现错误
接收程序中...中的 0x7c84c3e3 处未处理的异常: 0xC0000005: 读取位置 0x003857a4 时发生访问冲突
[Quote=引用 4 楼 waistcoat13 的回复:]
发送端(vc6编译)
CString kk="http://123abc";
::SendMessage(hwnd,WM_USER+1,0,(LPARAM)(LPCSTR)kk);

接收端(vc9编译)
CString sUrl= CA2W((LPCSTR)lparam);
MessageBox(sUrl);//这里全是乱码,为什么不显示http://123abc
[/Quote]
muzizongheng 2009-11-12
  • 打赏
  • 举报
回复
是这样的,
你传的是字符指针, 而这个内存地址呢是不会在进程间共享的, 也就是说你传时的地址, 在你接收方的内存地址不一定是同样的字符啊.

因此不能这样来.
zyq5945 2009-11-12
  • 打赏
  • 举报
回复
额,马甲再现?!
只能在同一个进程内部传递地址值才有效,不同进程的地址值指向是不一样的,获取当然会乱码。
ccpaishi 2009-11-12
  • 打赏
  • 举报
回复
楼主统一编码格式,然后最好传输不要用cstring格式,这样很难控制。用指针好了
WaistCoat13 2009-11-12
  • 打赏
  • 举报
回复
发送端(vc6编译)
CString kk="http://123abc";
::SendMessage(hwnd,WM_USER+1,0,(LPARAM)(LPCSTR)kk);

接收端(vc9编译)
CString sUrl= CA2W((LPCSTR)lparam);
MessageBox(sUrl);//这里全是乱码,为什么不显示http://123abc
flyskytoday 2009-11-12
  • 打赏
  • 举报
回复
vc9默认的应该是unicode编译的,没改过

但这个全是英文字母或数字不存在这样的问题
且在vc6中这样试了CString kk=L"http://123abc";
结果同样是乱码
zyq5945 2009-11-12
  • 打赏
  • 举报
回复
VC6默认是ANSI编码,VC9默认是UNICODE编码。
两个进程的地址值不能传的。
用管道,共享内存都可以。
WaistCoat13 2009-11-12
  • 打赏
  • 举报
回复
你接收端是UNICODE编译的吧?

16,504

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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