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是什么内容,以下做一些测试。假设可执行程序名:test.exe。

1、命令:test.exe (回车)
lpCmdLine:0x00141f03 "" char *

注:
0x00141f03:lpCmdLine运行时内存地址
"":lpCmdLine内容,这里值是空串
char *:lpCmdLine类型,它指出lpCmdLine是字符串。

命令行中没任何参数。lpCmdLine是有效地址,但它是空字符串,即lpCmdLine[0]='/0'。因而程序要判断命令行是不是带参数不能用if (lpCmdLine)而应该用if (lpCmdLine[0])。

2、命令:test.exe --config-dir Wesnoth1.7 (回车)
lpCmdLine:0x00141f03 "--config-dir Wesnoth1.7" char *

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

3、命令:test.exe "--config-dir Wesnoth1.7" (回车)
lpCmdLine:0x00141f03 ""--config-dir Wesnoth1.7"" char *

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

4、命令:test.exe "--config-dir "Wesnoth1.7" (回车)
lpCmdLine:0x00141f03 ""--config-dir "Wesnoth1.7"" char *

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

WinMain的参数不像传统的main函数,会依着特殊字符得出两个参数argv和argc,它就是除去可执行文件字符串(加上后续空格符)的整个命令行作为一个字符串,直接给了lpCmdLine。

程序一般作法是参数以空格符进行分隔,所以为了便于程序解析参数,当某个参数中有空格符时,例如program files,那最好能用某种方法让程序知道它是一个参数,所以一直沿袭作法就是在它的外头加上""。

 

 

 

SEXWOW 说的的 Shell 打开文件只是其中一种,除了 Shell 打开,还可以用 DDE 打开。

很多程序都有命令行参数,但是在 Windows 软件里,命令行参数一般不被普通用户直接使用。

比如,WinRAR 在解压的时候就后台调用了 Rar.exe,并把很多参数作为命令行参数传递给 Rar.exe,这样 Rar.exe 根据这些参数对文件进行压缩。

再比如,我们的编译器环境,VC++,后台调用了 CL.exe 和 Link.exe 进行编译和链接,同时把很多参数传递给它们。让它们根据这些参数进行工作。

再比如我们经常用的 RegSvr32 /u ... ,RunDLL32 **.dll

这里的 /u,*.dll 也是命令行参数。

如果你要编译带有命令行参数的 EXE,就需要这个 lpCmdline。

另外,纠正你一个错误,lpCmdline 不是操作系统传递给 WinMain 的,而是 VC++ 的运行时库获得命令行参数,并传递给你编写的 WinMain 函数。
要注意的是,VC++ 获得的 EXE,首先执行的是 VC++ 运行时库的开始程序,然后获得各种参数(包括 lpCmdline)以后传递给 WinMain。

操作系统是不管你有没有 WinMain 的,更不会给一个程序的某个函数传递任何参数。

 

 

 

 

举个例子来说吧:
你在双击一个文件时,系统会调用相应的程序来打开文件,(如你双击一个.txt文件的时候,系统会调用notepad.exe来打开文件),这个时候系统会传一个命令行参数给WinMain,也就是说lpCmdLine等于那个.txt文件的路径(例如是D:/1.txt),就是这个意思

你可能感兴趣的:(c++)