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。


发布评论