main 及 WinMain参数

来源:互联网 发布:编程字体在哪下 编辑:程序博客网 时间:2024/06/09 20:40
最近在写win32的界面程序比较多(以前多写命令行和dll), 所以多了解了下WinMain, 并与main作下比较. 作为一个笔记吧.

C/C++语言中的main函数, 经常带有参数argc, argv, 如下:
int main(int argc, char** argv)
int main(int argc, char* argv[])        //也可以是wchar_t 或 tchar
argc 是指命令行输入参数的个数, argv存储了所有的命令行参数. 在命令行下, 每两个argv[n]之间以空格分隔.
如在命令行下输入 test.exe a b
argc 为 3
argv[0] 为 "test.exe"
argv[1] 为 "a"
argv[2] 为 "b"

以下一个简单的程序可以帮你看看argc, argv具体代表什么.

#include <stdio.h>

int main(int argc, char* argv[])
{
    for (int i = 0; i < argc; i++)
    {
        printf("%s\n", argv[i]);
    }
    return 0;
}

另外, vc环境下向程序传递参数可以在 Debugging -> command argument 下设置. (下面说的WinMain也一样)


WinMain函数的原型声明如下:

int WINAPI WinMain(
                HINSTANCE hInstance, // handle to current instance
                HINSTANCE hPrevInstance, // handle to previous instance
                LPSTR lpCmdLine, // command line
                int nCmdShow // show state
);

WinMain函数接收4个参数, 这些参数都是在系统调用WinMain函数时, 传递给应用程序的.

第一个参数hInstance表示该程序当前运行的实例的句柄, 这是一个数值. 当程序在Windows下运行时, 它唯一标识运行中的实例(注意, 只有运行中的程序实例, 才有实例句柄). 一个应用程序可以运行多个实例, 每运行一个实例, 系统都会给该实例分配一个句柄值, 并通过hInstance参数传递给WinMain函数.

第二个参数hPrevInstance (MSDN)在Win32环境下, 这个参数不起作用.

第三个参数lpCmdLine是一个以空('\0')终止的字符串, 指定传递给应用程序的命令行参数.
注: 这个跟命令行的int main(int argc, char* argv[])不同
仍以上文
test.exe a b
为例, lpCmdLine 为 "a b"

第四个参数nCmdShow指定程序的窗口应该如何显示, 例如最大化、最小化、隐藏等. 这个参数的值由该程序的调用者所指定, 应用程序通常不需要去理会这个参数的值.

关于WinMain函数前的修饰符WINAPI, 请参看下面关于__stdcall的介绍. 读者可以利用goto definition功能查看WINAPI的定义, 可以看到WINAPI其实就是__stdcall
0 0