2024年4月12日发(作者:)

WinMain中的lpCmdLine参数 - 木水的日志 - 网易博客

win32可执行程序分为两种类型,基于控制台(Consol-based)的和基于窗口

(Windows-based)的。基于控制台程序它的入口函数是传统的main,基于窗口的则是

WinMain。这两个入口函数一大区别是对于命令行参数的处理。

WinMain函数原型:int WinMain(HINSTANCE hInstance, HINSTANCE

hPrevInstance, LPSTR lpCmdLine, int nCmdShow),LPSTR lpCmdLine存储了命令行

参数信息,MSDN对这参数解释:

lpCmdLine

[in] Pointer to a null-terminated string specifying the command line for the

application, excluding the program name. To retrieve the entire command line, use

the GetCommandLine function.

(指向一个应用程序命令中,除了程序名的null字符结束的字符串。

GetCommandLine函数可以返回整个命令行)

为了更清晰lpCmdLine是什么内容,以下做一些测试。假设可执行程序名:。

1、命令: (回车)

lpCmdLine:0x00141f03 "" char *

注:

0x00141f03:lpCmdLine运行时内存地址

"":lpCmdLine内容,这里值是空串

char *:lpCmdLine类型,它指出lpCmdLine是字符串。

命令行中没任何参数。lpCmdLine是有效地址,但它是空字符串,即

lpCmdLine[0]='0'。因而程序要判断命令行是不是带参数不能用if (lpCmdLine)而应该用

if (lpCmdLine[0])。

2、命令: --config-dir Wesnoth1.7 (回车)

lpCmdLine:0x00141f03 "--config-dir Wesnoth1.7" char *

命令行带参数,参数间有空格但没有"符号。

3、命令: "--config-dir Wesnoth1.7" (回车)

lpCmdLine:0x00141f03 ""--config-dir Wesnoth1.7"" char *

相比2,这里强行给参数加了"",可以看到lpCmdLine不对参数内的""进行处理,直

接复制。

4、命令: "--config-dir "Wesnoth1.7" (回车)

lpCmdLine:0x00141f03 ""--config-dir "Wesnoth1.7"" char *

相比于3,这里强行在中间加一个",这造成了""没有配对,但WinMain只是原样复

制而已。

WinMain的参数不像传统的main函数,会依着特殊字符得出两个参数argv和argc,

它就是除去可执行文件字符串(加上后续空格符)的整个命令行作为一个字符串,直接给

了lpCmdLine。