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。
|