鱼C论坛

 找回密码
 立即注册
查看: 2394|回复: 2

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

[复制链接]
发表于 2014-10-17 14:06:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先发两段程序:
  .386
  .model flat,stdcall
  option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include  windows.inc
include  user32.inc
includelib user32.lib
include  kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  .data
hWnd  dd ?
szBuffer db 256 dup (?)
  .const
szCaption db '发信程序',0
szStart  db 'Send说:按下OK按钮开始发送消息, 参数param是 %08x!',0
szReturn db 'Send说:消息已经发送!',0
szDestClass db 'MyClass',0 ;目标窗口的窗口类
szText  db '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
szClassName  db '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 写入了共享的内存中,那么接受的时候,是不是也可以从这个内存中提取写入的内容呢?
如果可以,那么这个共享内存的地址怎么得知,还有一个问题就是,接受程序的内容中,也有把一段字符串写入内存中,如果把这个一段去掉,那么程序运行的结果就是接受程序弹出的对话框,没有任何文字,那怎么才可以把发送程序中写入的内容直接在接受程序中显示呢

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2014-10-30 15:47:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-10-31 20:11:31 | 显示全部楼层
wsprintf 写入的不是共享内存.

调用SendMessage时,

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

...

等待程序2的执行

返回等待程序1

共享内存释放

复制,创建,摧毁,都没我们的事,地址的变更,视频中已着重显示出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 14:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表