VC++开发的程序,在调试时总是从main或者WinMain函数开始,这就容易让人误会它们是程序的第一条指令执行处,这个认识其实是错误的main和WinMain也是一个函数,也需要一个调用者,在它们被调用前,编译器其实已经做了很多的事情,所以main或者WinMain应该是语法规定的用户的入口,而不是应用程序入口。
在应用程序被操作系统加载时,操作系统会分析执行文件内的数据,分配相关资源,读取执行文件中的代码和数据到合适的内存单元,然后才是执行入口代码,入口代码其实 并不是 main或者WinMain,通常是mainCRTStartup,wmainCRTStartup,WinMainCRTStartup,wWinMainCRTStartup。前2个是控制台环境下的启动函数,后2个是windows环境下的启动函数。
图中显示程序运行时调用了三个函数,依次是KERNEL32、mainCRTStartup和main。
main函数被调用前要先调用的函数如下:
这些函数调用结束后会调用main函数,根据main函数调用特征,会将3个参数压入栈内作为函数的参数。三个参数分别为,命令行参数个数,命令行参数信息和环境变量信息。