注意:本次追踪环境MFC是基于对话框。
MFC对SDK做了一层封装,SDK创建一个窗口所需要的东西MFC一样不能少,SDK创建窗口6要素:
消息循环位置:
首先定位入口函数,VS2019里CRL+F查找,先查找WinMain:
Main也没有找到,它其实是在MFC的框架代码里面,框架代码并不在工程里,找到一个MFC的类定进去:
它的框架代码在这:
文件太多了,可以用NotePad++帮忙查找:
搜索里点击文件查找,把路径给过去:
输入WinMain查找:
有//的是注释,_tmain明显就是:
路径:
G:\ProgramFiles(x86)\MicrosoftVisualStudio\2019\Professional\VC\Tools\MSVC\14.28.29333\atlmfc\src\mfc\appmodul.cpp
也可以在VS2019里直接按F10,启动时直接定位到入口处:
想要往里一路跟进需要更改设置,点击项目属性里的高级:
换成静态库的MFC,然后就可以跟进去了:
找的思路是先基于消息循环,因为一执行到消息循环它会一直在里面循环,跟到一个初始化函数InitInstance的时候会弹出对话框:
在这个地方下断点跟进去,往里跟进去发现其实是这个函数DoModal弹出的对话框:
往里跟又发现是 CreateRunDlgIndirect 弹出的对话框:
往这个函数跟进去是先进到FromHandle函数:
执行完之后再次会进入到CreateRunDlgIndirect:
里面有个RunModalLoop函数,它在这弹出了对话框,下断点继续跟进去:
此后的循环就卡在了里面:
这个for(;;)里又有一个while循环和一个do-while循环:
消息循环最终是在do-while里:
创建对话框的位置:
在进入RunModalLoop函数前的CreateDlgIndirect函数:
跟进去:
一直跟到AfxHookWindowCreate:
里面设置了一些状态:
里面英文又是线程又是钩子的,有点不像是创建对话框的,据百度资料核查,通过AfxHookWindowCreate,在当前线程中安装了一个钩子,用来拦截和窗口相关的事件。
钩子下面的函数就是了,它一执行完就瞬间弹出一个窗口又没了。