
在Windows应用程序中,我们可以认为 WinMain() 函数是程序的入口,WinMain()的原型如下:
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nCmdShow
);
前面说过,资源存在于内存之后,那么一个每个程序运行之后,也被看做一个资源,它有一个属于自己的句柄,这个句柄就保存在变量 hInstance 中。
hPreInstance 表示当前实例的前一个实例的句柄,在Win32环境下,参数总是为NULL
lpCmdLine 用于存放传递给应用程序的参数,那么如何给应用程序传递参数?这里举几个例子:
我们可以建立一个程序,读取参数:
1) 建立头文件 StdAfx.h
#if
!defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
#define
AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
2) 建立test.cpp 文件
#include "stdafx.h"
int APIENTRY WinMain(HINSTANCE
hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MessageBox(NULL,lpCmdLine,"CmdLine",0);
return 0;
}
当我们拖拽一个文件到生成的程序的时候(双击选择使用此程序打开也一样),出现:
nCmdShow,指定窗口第一次出现(程序刚刚启动时)时的显示方式。显示方式有多种,比如:
如果需要改变系统的默认的显示方式,需要在创建窗口之前指定nCmdShow的指(通过一个简单的赋值语句nCmdShow = n)
不过,其实这里要让nCmdShow起作用,需要把nCmdShow作为参数传递给ShowWindow函数(参考http://www.i170.com/user/killercat/Article_63486 中有关内容)
另外,这里稍微说明一下 WINAPI 这个宏定义,我们看WinMain函数的原型:
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nCmdShow
);
WINAPI是这样定义的:
#define WINAPI
__stdcall
在VC6.0下生成的WinMain函数,实际上是:
int APIENTRY WinMain(
HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nCmdShow
);
APIENTRY 这个定义为:
#define APIENTRY WINAPI
所以归根到底都是 __stdcall,这个是什么东西了?这里解释一下:
__stdcall一种调用约定(调用函数时候的一种约定),其他的调用约定有:
__cdecl 和 __fastcall
调用约定将决定一下内容:它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。
WIN32API使用的是__stdcall调用约定
标准C,C++使用的是__cdecl调用约定
__stdcall调用约定:函数的参数自右向左压栈,被调用的函数在返回前清理传送参数的内存栈
__cdecl调用约定:每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的调用约定
(有关内容参考来源:http://blog.chinaunix.net/u/22878/showart_231924.html)
有关内容可以参考:
http://msdn2.microsoft.com/zh-cn/library/zxk0tw93(VS.80).aspx
http://msdn2.microsoft.com/zh-cn/library/zkwh89ks(VS.80).aspx
http://blog.csdn.net/yxin1322/articles/564597.aspx
Powered by Haiwit