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);
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);
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询