aa05001 发表于 2014-10-17 14:06:00

关于win32中 窗口间的消息互发的不理解

先发两段程序:
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
includewindows.inc
includeuser32.inc
includelib user32.lib
includekernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
hWnddd ?
szBuffer db 256 dup (?)
.const
szCaption db '发信程序',0
szStartdb 'Send说:按下OK按钮开始发送消息, 参数param是 %08x!',0
szReturn db 'Send说:消息已经发送!',0
szDestClass db 'MyClass',0 ;目标窗口的窗口类
szTextdb 'Send说:亲爱的,收到吗?,0
szNotFound db 'Send说:亲,没有找到接收的窗口!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke FindWindow,addr szDestClass,NULL
.if eax
   mov hWnd,eax    ; 找到目标窗口则发送消息
   invoke wsprintf,addr szBuffer,addr szStart,addr szText
   invoke MessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
   invoke SendMessage,hWnd,WM_SETTEXT,0,addr szText
   invoke MessageBox,NULL,offset szReturn,offset szCaption,MB_OK
.else
   invoke MessageBox,NULL,offset szNotFound,offset szCaption,MB_OK
.endif
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start



接受程序:

.data?
hInstance dd ?
hWinMain dd ?
szBuffer db 512 dup (?)
.const
szClassNamedb 'MyClass',0
szCaptionMain db '回信程序',0
szReceive db 'Receive说:接受到 WM_SETTEXT 消息',0dh,0ah
   db 'Receive说:param 的内容是 %08x',0dh,0ah
   db 'Receive说:指向的字符串是 "%s"',0dh,0ah,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
mov eax,uMsg
;********************************************************************
.if eax == WM_CLOSE
   invoke DestroyWindow,hWinMain
   invoke PostQuitMessage,NULL
;********************************************************************
; 收到 WM_SETTEXT 消息则将消息字符串和字符串地址显示出来
;********************************************************************
.elseif eax == WM_SETTEXT
   invoke wsprintf,addr szBuffer,addr szReceive,\
   lParam,lParam
   invoke MessageBox,hWnd,offset szBuffer,addr szCaptionMain,MB_OK

我想问的问题是,发送程序中,把需要发送的内容用wsprintf 写入了共享的内存中,那么接受的时候,是不是也可以从这个内存中提取写入的内容呢?
如果可以,那么这个共享内存的地址怎么得知,还有一个问题就是,接受程序的内容中,也有把一段字符串写入内存中,如果把这个一段去掉,那么程序运行的结果就是接受程序弹出的对话框,没有任何文字,那怎么才可以把发送程序中写入的内容直接在接受程序中显示呢

大个的糖果 发表于 2014-10-30 15:47:47

az4121 发表于 2014-10-31 20:11:31

wsprintf 写入的不是共享内存.

调用SendMessage时,

Windows根据SendMessage的参数给出的地址,计算出字符串的长度,创建合适的共享内存,复制wsprintf格式出的字符串到共享内存

...

等待程序2的执行

返回等待程序1

共享内存释放

复制,创建,摧毁,都没我们的事,地址的变更,视频中已着重显示出了
页: [1]
查看完整版本: 关于win32中 窗口间的消息互发的不理解