鱼C论坛

 找回密码
 立即注册
查看: 2199|回复: 4

为什么DefWindowProc后面会跟个ret?

[复制链接]
发表于 2014-7-2 17:36:30 | 显示全部楼层 |阅读模式
5鱼币
invoke    DefWindowProc,hWhd,uMsg,wParam,lParam
                ret
为什么这个函数后面会有个ret,而调用别的API函数时并不需要,难道DefWindowProc的里面在结尾处没有ret吗?
在对话框这一章节里也有一个问题,就是_ProcDlgMain函数的结尾处总是这样的:
.if
.......
.else
           mov  eax,FAlSE
           ret
.endif
          mov eax,TRUE
          ret
_ProcDlgMain    endp
第一个ret是怎么回事?

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

使用道具 举报

发表于 2014-7-2 20:11:43 | 显示全部楼层
这里的第一个ret是返回到mov eax, uMsg的下一条语句,也就是xor eax, eax处进行执行, 而最后一个ret的话是返回到这个回调函数的上面去,这样将执行回调函数下面的语句,也就是mov @stWndClass.hbrBackground, COLOR_MENU + 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-3 05:11:29 | 显示全部楼层

最后一个ret好理解。第一个ret是如何跳到xor eax,eax处的?在哪儿对xor,eax,eax这条语句的地址进行的入栈?把第一个ret去掉,也能通过编译,只是运行程序时,并没有显示,也就是说并没有运行到ShowWindow

点评

第一个ret的话,它前面有一个endif语句呢,当执行到第一个ret的时候,它就跳到if之前去执行了!  详情 回复 发表于 2014-7-5 13:52
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-5 13:52:27 | 显示全部楼层
魔诀 发表于 2014-7-3 05:11
最后一个ret好理解。第一个ret是如何跳到xor eax,eax处的?在哪儿对xor,eax,eax这条语句的地址进行的入栈 ...

第一个ret的话,它前面有一个endif语句呢,当执行到第一个ret的时候,它就跳到if之前去执行了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-26 13:41:15 | 显示全部楼层
ProcWinMain 是回调函数,作用是将eax(表示消息处理状态)返回给调用者user32.dll,第一个调用defwindowproc 程序对其返回值不做干涉直接返回eax的值,第二个设置默认的返回值,大多数消息将eax清零表示返回成功,程序设置的默认返回语句。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 12:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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