windows笔记-Windows应用程序

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 链接程序开关,那么该链接程序期望找到一个WinMainwWinmain 函数。如果这两个函数都不存在,链接程序便返回一个“未转换的外部符号”的错误消息。否则,它可以分别选择WinMainCRTStartup 函数或wWinMainCRTStartup 函数。

 

注意:链接程序负责在它连接可执行文件时选择相应的C/C++ 运行期启动 函数。如果设定了/SUBSYSTEM:WINDOWS 链接程序开关,那么该链接程序期望找到一个WinMain wWinmain 函数。如果这两个函数都不存在,链接程序便返回一个“未转换的外部符号”的错误消 息。否则,它可以分别选择WinMainCRTStartup 函数或wWinMainCRTStartup 函数。

 

启动函数的功能归纳如下:

• 检索指向新进程的完整命令行的指针。

• 检索指向新进程的环境变量的指针。

• 对C/C++ 运行期的全局变量进行初始化。如果包含了StdLib.h 文件,代码就能访问这些变量。

• 对C 运行期内存单元分配函数(malloccalloc )和其他低层输入/ 输出例程使用的内存 进行初始化。

• 为所有全局和静态C++ 类对象 调用构造函数。

 

当进入点函数返回时:

启动函数便调用C 运行期的exit 函数,将返回值(nMainRetVal )传递给它。Exit 函数负责下面的操作:

调用由_onexit 函数的调用而注册的任何函数。

为所有全局的和静态的C++ 类对象调用析构 函数。

调用操作系统的ExitProcess 函数,将nMainRetVal 传递给它。这使得该操作系统能够撤消进程并设置它的exit

 

程序能够使用的C / C + +运行期全局变量

变量名

类型

说明

_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值