c++进程间通讯 为什么不能用PostMessage传递指针数据

1.进程A调用CreateFileMapping创建一个内存映射文件。


2.进程A调用MapViewOfFile获取到映射到文件的内存起始地址,调用memcpy往内存中拷贝数据。


3.进程B调用CreateFileMapping打开进程A创建的内存映射文件。


4.进程B调用MapViewOfFile获取到映射到文件的内存起始地址,调用memcpy从内存中读出数据。


5.通信完后进程A,B分别调用UnmapViewOfFile,CloseHandle取消内存映射和关闭内存映射对象句柄。


用消息来实现,比较简单。
有两种方式,一种是采用WM_COPYDATA消息,这个是专门用来进行进程通讯的,可以发一个整块内存的指针过去,用SendMessage或
者SendMessageTimeout的方式;
  pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);//注意这里不能用PostMessage,因其是异步函数,接收端不管有没有收到 都会返回


注意postemessage跨进程传地址无效,故进程间传指针数据以下两种是不行的

PostMessage发送后直接返回,然后在接受进程未取出数据之前,数据可能就已经被销毁,指针的值可能已经改变

SendMessage()函数,接收方在数据复制完成前不返回,这样发送方就不可能删除和修改数据。


另一种是广播窗口消息,比如两边都定义UINT g_uMsgBkChanged = ::RegisterWindowMessage( SYSTEM_MSG_BG_CHANGED);

然后以g_uMsgBackgroundChanged 为消息发送,不过这种只能发送包含wParam和lParam两个相当于是int型大小的信息过去

::PostMessage( HWND_BROADCAST, g_uMsgBackgroundChanged, m_nBgIndex, 0);   //广播窗口消息


也可以向指定窗口发送自定义消息

#define MSG_BT_SETTINGS_CHANGE       (WM_USER + 1000)

int m_nBtSettings = 0;  //有32个bit 数据位使用

::PostMessage(m_wnd,  MSG_BT_SETTINGS_CHANGE, 0, m_nBtSettings);




  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值