|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1.3.4 程序入口
正像main是C程序的入口一样,Windows的程序入口是WinMain,它总是以下面的面目出现:
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
程序入口在/Platform SDK/User Interface Services/Windowing/Windows/Window Reference/Window Functions中有所描述【现已经更改为:/MSDN Library/Win32 and COM Development/User Interface/Windows User Interface/windowing/windows/functions/里】,并在WINBASE.H中声明如下:
int
WINAPI
WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
);
多半儿你已经察觉到我在HelloMsg.c中稍稍做了些改动。第三个参数WINBASE.H中定义为LPSTR,而我(在HelloMsg.c中)却把它改成了PSTR。这两种数据类型在WINNT.H中都声明为指向字符串的指针。前缀LP代表长指针(Long Pointer),它是16位Windows的产物。
我还改动了WinMain声明中的两个参数名,因为绝大部分Windows程序在变量命名上都采用所谓“匈牙利标记法”(Hungarian Notation)系统。在这一系统中,变量名前都有一个短前缀,用以表明该变量的数据类型。在第3章中,我将详细讨论这一概念。现在只需要记住前缀i表示int,前缀sz表示“以零结尾的字符串”(String Terminated with a Zero)。
WinMain函数的返回值被定义为int。WINDEF.H中用以下语句来定义WINAPI标识符:
#define WINAPI _stdcall
这条语句规定了一种函数调用约定,表明如何生成在堆栈中放置函数调用参数的机器代码。绝大多数Windows函数调用都定义成WINAPI。
WinMain的第一个参数一般叫做“实例句柄”(Instance Handle)。在Windows程序中,句柄无非就是一个数值,程序里用它来标识某些东西。比如在我们这个例子里,这个句柄就唯一标识了我们的这个程序。实际上在某些Windows程序中,把句柄当作调用参数是必须的。比如在早期的Windows版本中,当多路并发运行同一个程序的时,就需要为那个程序创建多个实例。同一程序的所有的实例都共享代码以及只读存储(即菜单或者对话框之类的模板资源)。一个程序可以通过查看hPrevhInstance参数从而知道是否有它的其他实例正在运行。它也就可以因此跳过某些零散杂务步骤,把一些数据从前一个实例搬到自己的数据区来。【系统运行时由操作系统赋值或者给予参数值】
在32位的Windows中,这一概念已不再用。因此WinMain的第二个参数通常总是NULL(定义为0)。
WinMain的第三个参数是用来运行程序的命令行(Command Line)。有些Windows程序在启动时用它来把文件装入内存。WinMain的第四个参数用来指明程序最初如何显示【用字符模式输入执行文件时,可以使用】;或正常显示,或最大化到全屏,或最小化显示在任务栏。我们将在第3章里讨论这一参数的使用。
|
|