windows核心编程--windows程序的执行

本文介绍了Windows平台上两类应用程序(GUI和CUI)的启动过程。详细解释了从C/C++运行时启动函数到应用程序入口函数的调用过程,以及程序退出时的清理工作。
Windows 应用程序的执行
 
Windows 支持两种类型的应用程序。一种是基于图形用户界面( GUI )的应用程序,另一种是基于控制台用户界面( CUI )的应用程序。 ( 两者间可以相互转化 , 没有明确的界限 , 就是说可以让 CUI 程序中可以有 Dialog 界面等 , GUI 界面中也可以有 console 来输出信息 )
 
对于一个应用程序:
操作系统实际上先调用的是C / C + +运行期启动函数。该函数负责对C / C + +运行期库进行初始化,这样,就可以调用m a l l o c 和f r e e 之类的函数。它还能够确保已经声明的任何全局对象和静态C + +对象能够在代码执行以前正确地创建。链接程序负责在它连接可执行文件时选择相应的C / C + +运行期启动函数。如果设定了/ S U B S Y S T E M : W I N D O W S 链接程序开关,那 么该链接程序期望找到一个Wi n M a i n 或w Wi n m a i n函数。如果这两个函数都不存在,链接程序便返回一个“未转换的外部符号”的错误消 息。否则,它可以分别选择Wi n M a i n C RT S t a r t u p 函数或w Wi n M a i n C RT S t a r t u p 函数。
启动函数的功能归纳如下:
检索指向新进程的完整命令行的指针。
检索指向新进程的环境变量的指针。
C / C + + 运行期的全局变量进行初始化。如果包含了 S t d L i b . h 文件,代码就能访问这些变量。表 4 - 1 列出了这些变量。
C 运行期内存单元分配函数( m a l l o c c a l l o c )和其他低层输入 / 输出例程使用的内存栈进行初始化。
为所有全局和静态 C + + 类对象调用构造函数。
当所有这些初始化操作完成后, C / C + + 启动函数就调用应用程序的进入点函数。如果编写了一个 w Wi n M a i n 函数,它将以下面的形式被调用
GetStartupInfo(&StartupInfo);
int nMainRetVal = wWinMain(GetMjduleHandle(NULL),
   NULL, pszCommandLineUnicode,
   (StartupInfo.dwFlags & STARTF_USESHOWWINDOW) ? 
   StartupInfo.wShowWindow:SW_SHOWDEFAULT);
 

当进入点函数返回时,启动函数便调用 C 运行期的 e x i t 函数,将返回值( n M a i n R e t Va l )传递给它。 E x i t 函数负责下面的操作:
调用由 _onexit 函数的调用而注册的任何函数。
为所有全局的和静态的 C++ 类对象调用析构函数。
调用操作系统的 ExitProcess 函数,将 nMainRetVal 传递给它。这使得该操作系统能够撤消进程并设置它的 e x i t 代码。
 
附录 : 各种应用程序的进入点及对应的启动函数
 
应用程序类型
进入点
嵌入可执行文件的启动函数
需要ANSI字符和字符串的GUI应用程序
WinMain
WinMainCRTStartup
需要Unicode字符和字符串的GUI应用程序
wWinMainw
WinMainCRTStartup
需要ANSI字符和字符串的CUI应用程序
main
mainCRTStartup
需要Unicode字符和字符串的CUI应用程序
wmain
wmainCRTStartup
 
 
 
 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值