如何使用SendMessage和WM
展开全部
资料1:WM_COPYDATA是用内存映射机制实现的。
简单思路如下:
发送进程为A,目标进程为B。
当A进程用SendMessage(WM_COPYDATA,wParam,lParam)进行发送的时候,它先调用
HANDLE hMap = CreateFileMapping(0xFFFFFFFF,NULL,PAGE_READWRITE,NULL,dwSize,"MSName")
其中dwSize为lParam信息得到的长度(也就是COPYDATASTRUCT结构得到的信息)
MSName可以是MS自己定义的名字,这样就把内容复制到共享内存中。然后等待B进程处理;
当B进程处理WM_COPYDATA消息时,它先用OpenFileMapping()和MapViewOfFile()得到共享内存地址,
然后再把地址值保存到lParam里面使B进程处理消息过程能处理这些数据,处理好后进行A与B再
用CloseHandle()等API进行清除操作就OK了。
SkyJacker注:按照这种说法,那么进程B,如何知道映射文件名是"MSName"呢?
还是lParam本身就表示映射文件名了?
资料2:
SendMessage是同步函数,会等到窗口处理完才返回
PostMessage是异步函数,只是将消息挂到消息队列中就立即返回,由于无法同步可能导致无法响应,
一般情况下窗口消息是不会被丢弃的。
这是因为系统必须管理用以传递数据的缓冲区的生命期,如果你使用PostMessage,数据缓冲区会在接受端有机会处理该数据之前被系统摧毁掉!
看看候杰翻译的"多线程程序设计" 里面有详细解释,总而言之 只能用SendMessage。
SkyJacker注:话虽然是这么说,但是异步也可以接收数据吧。socket函数connect,recv,send等也运行正常啊。
因此,只能是SendMessage函数的设计使然,而不是因为同步或异步的原因。
简单思路如下:
发送进程为A,目标进程为B。
当A进程用SendMessage(WM_COPYDATA,wParam,lParam)进行发送的时候,它先调用
HANDLE hMap = CreateFileMapping(0xFFFFFFFF,NULL,PAGE_READWRITE,NULL,dwSize,"MSName")
其中dwSize为lParam信息得到的长度(也就是COPYDATASTRUCT结构得到的信息)
MSName可以是MS自己定义的名字,这样就把内容复制到共享内存中。然后等待B进程处理;
当B进程处理WM_COPYDATA消息时,它先用OpenFileMapping()和MapViewOfFile()得到共享内存地址,
然后再把地址值保存到lParam里面使B进程处理消息过程能处理这些数据,处理好后进行A与B再
用CloseHandle()等API进行清除操作就OK了。
SkyJacker注:按照这种说法,那么进程B,如何知道映射文件名是"MSName"呢?
还是lParam本身就表示映射文件名了?
资料2:
SendMessage是同步函数,会等到窗口处理完才返回
PostMessage是异步函数,只是将消息挂到消息队列中就立即返回,由于无法同步可能导致无法响应,
一般情况下窗口消息是不会被丢弃的。
这是因为系统必须管理用以传递数据的缓冲区的生命期,如果你使用PostMessage,数据缓冲区会在接受端有机会处理该数据之前被系统摧毁掉!
看看候杰翻译的"多线程程序设计" 里面有详细解释,总而言之 只能用SendMessage。
SkyJacker注:话虽然是这么说,但是异步也可以接收数据吧。socket函数connect,recv,send等也运行正常啊。
因此,只能是SendMessage函数的设计使然,而不是因为同步或异步的原因。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询