Windows 支持两种类型的应用程序。
一是基于图形用户界面 (GUI) 的应用程序。(见:一个简单的windows GUI应用程序 )
二是基于控制台用户界面 (CUI) 的应用程序。
用于 CUI 应用程序的链接程序开关是 /SUBSYSTEM:CONDOLE ,
用于 G U I 应用程序的链接程序开关是/ SUBSYSTEM : WINDOWS 。
当用户运行一个应用程序时,操作系统的加载程序就会查看可执行图形程序的标题,并抓取该子系统的值。
如果该值指明一个CUI 应用程序,那么加载程序就会自动保证为该应用程序创建文本控制台窗口。
如果该值指明这是个G U I 应用程序,那么加载程序不创建控制台窗口,而只是加载应用程序。
Windows 应用程序必须拥有一个在应用程序启动运行时调用的进入点函数。可以使用的进入点函数有 4 个 :
int WINAPI WinMain (HINSTANCE hinstExe, HINSTANCE, PSTR pszCmdLine, int nCmdShow);
int WINAPT wWinMain (HINSTANCE hinstExe,HINSTANCE, PWSTR pszCmdLine,int nCmdShow);
int __cdecl main (int argc,char *argv[],char *envp[]);
int _cdecl wmain (int argc, wchar_t *argv[], wchar_t *envp[ ]);
操作系统实际上并不调用你编写的进入点函数。它调用的是 C/C++ 运行期启动 函数 。该函数负责对 C/C++ 运行期库进行 初始化,这样,就可以 调用 malloc 和 free 之类的函数。它还能够确保已经声明的任何全局对象和静态 C++ 对象能够在代码执行以前正确地创建。
下面说明源代 码中可以实现哪个进入点以及何时使用该进入点 。
应用程序的进入点
应用程序类型 | 进入点 | 嵌入可执行文件的启动函数 |
需要 ANSI 字符和字符串的 GUI 应用程序 | WinMain | WinMainCRTStartup |
需要 Unicode 字符和字符串的 GUI 应用程序 | wWinMainw | WinMainCRTStartup |
需要 ANSI 字符和字符串的 CUI 应用程序 | main | mainCRTStartup |
需要 Unicode 字符和字符串的 CUI 应用程序 | wmain | wmainCRTStartup |
链接程序 负责在它连接可执行文件时选择相应的C/C++ 运行期启动 函数。
如果设定了/ SUBSYSTEM:WINDOWS 链接程序开关,那么该链接程序期望找到一个WinMain 或wWinmain 函数。如果这两个函数都不存在,链接程序便返回一个“未转换的外部符号”的错误消息。否则,它可以分别选择WinMainCRTStartup 函数或wWinMainCRTStartup 函数。
注意:链接程序负责在它连接可执行文件时选择相应的C/C++ 运行期启动 函数。如果设定了/SUBSYSTEM:WINDOWS 链接程序开关,那么该链接程序期望找到一个WinMain 或wWinmain 函数。如果这两个函数都不存在,链接程序便返回一个“未转换的外部符号”的错误消 息。否则,它可以分别选择WinMainCRTStartup 函数或wWinMainCRTStartup 函数。
启动函数的功能归纳如下:
• 检索指向新进程的完整命令行的指针。
• 检索指向新进程的环境变量的指针。
• 对C/C++ 运行期的全局变量进行初始化。如果包含了StdLib.h 文件,代码就能访问这些变量。
• 对C 运行期内存单元分配函数(malloc 和calloc )和其他低层输入/ 输出例程使用的内存栈 进行初始化。
• 为所有全局和静态C++ 类对象 调用构造函数。
当进入点函数返回时:
启动函数便调用C 运行期的exit 函数,将返回值(nMainRetVal )传递给它。Exit 函数负责下面的操作:
• 调用由_onexit 函数的调用而注册的任何函数。
• 为所有全局的和静态的C++ 类对象调用析构 函数。
• 调用操作系统的ExitProcess 函数,将nMainRetVal 传递给它。这使得该操作系统能够撤消进程并设置它的exit 代
变量名 | 类型 | 说明 |
_osver | unsigned int | 操作系统的测试版本。例如 Windows 2000 Beta 3 是测试版本 2031 。因此 _osver 的值是 2031 |
_winmajor | unsigned int | 采用十六进制表示法的 Windows 主要版本。对于 Windows2000 来说,它的值是 5 |
_winminor | unsigned int | 采用十六进制表示法的 Windows 次要版本。对于 Windows2000 来说,它的值是 0 |
_winver | unsigned int | ( _winmajor < < 8 ) + _ winminor 在命令行上传递的参数号 |
__argc | unsigned int | 带有指向 ANSI/Unicode 字符串的指针的 __argc 大小的数组 |
__argv | char * * | 带有指向 ANSI/Unicode 字符串的指针的 __argc 大小的数组 |
__wargv | wchar_t * * | 每个数组项均指向一个命令行参数 |
_environ | char * * | 指向 ANSI/Unicode 字符串的指针的数组。每个数组项指向一个环境字符串 |
_wenviron | wchar_t * * | 指向 ANSI/Unicode 字符串的指针的数组。每个数组项指向一个环境字符串 |
_pgmptr | char * | 正在运行的程序的 ANSI/Unicode 全路径和名字 |
_wpgmptr | wchar_t * | 正在运行的程序的 ANSI/Unicode 全路径和名字 |
本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/08/31/1814131.html