窗口间传递数据

 

窗口间的消息互发
 
上一节课我们演示了两个窗口间进行字符串的传输,但君不见字符串是正确地传了过来,但地址却不是发送程序的参数地址,这是怎么回事呢?
 
答案是 Windows 做”红娘”做到底,它拷贝了WM_SETTEXT 消息 lParam 指向的字符串,并在接收程序的地址空间中开了一块内存临时存放,然后把新的地址值当做 lParam 传给接收程序。
 
因为 lParam 的数值是多少事实上并不重要,重要的是它指向的字符串是否正确。
 
在窗口间传递数据
 
在 WM_SETTEXT 这一类的消息中,Windows 可以将参数所指的字符串传递到目标窗口过程中。
局限性是传递的数据也只限于以 0 作为结尾的字符串。
 
那如果我们需要在不同窗口间自由地拷贝任意类型的数据,应该怎么办呢?
Windows 为我们提供了一个特殊的窗口消息 – WM_COPYDATA
 
WM_COPYDATA 消息用一个 COPYDATASTRUCT 结构来描述要拷贝的数据长度和位置。
 
COPYDATASTRUCT STRUCT
 dwData DWORD ? ; 附加字段
 cbData DWORD ? ; 数据长度
 lpData DWORD ? ; 数据位置指针
COPYDATASTRUCT ENDS
 

cbData 字段规定了发送的字节数,lpData 字段是指向待发送数据的指针。
 
填充好数据结构后,用 SendMessage 函数就可以将数据发给目标窗口过程:
 
.data
stCopyData COPYDATASTRUCT <>
.code
。。。。。。
invoke SendMessage, hDestWnd, WM_COPYDATA, hwnd, addr stCopyData
 
注意,hDestWnd 为目标窗口句柄; wParam 指定为当前窗口的句柄 hWnd; lParam 指向已经填充完毕的 COPYDATASTRUCT 结构。
Windows 收到 WM_COPYDATA 消息后,会根据 cbData 字段的长度创建一块共享内存,并把 lpData 所指的数据拷贝到共享内存中并定位该共享内存新的地址覆盖到 lpData 字段中。
最后将经过处理的 COPYDATASTRUCT 结构发送给目标窗口过程。再最后,目标窗口过程返回后,Windows 自动给释放共享内存,SendMessage 函数返回。
 
演示:SendMessage2
 
SendMessage和PostMessage的区别
 
从逻辑上看,SendMessage 函数相当于直接调用其他窗口的窗口过程来处理某个消息,并等待窗口过程的返回。在函数返回后,目标窗口过程必定已经处理了该消息。
 
PostMessage 函数则将消息放入目标窗口的消息队列中并直接返回。函数返回后,目标窗口过程可能还没有处理到该消息。
 
对于普通的消息来说,两个函数除了在处理速度上有所区别外,其他的表现都一模一样。
 
但是对于 WM_SETTEXT, WM_COPYDATA 等在参数中用到指针的消息来说,两者就有所不同了。
 
我们尝试一下把 SendMessage2 的 SendMessage 改为 PostMessage:SendMessage3

本文来自:鱼C工作室<a href=http://www.fishc.com>  详细出处参考:http://www.fishc.com/a/shipin/Win32huibianyuyan/1147.html

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页