win32可執(zhí)行程序分為兩種類型,基于控制臺(tái)(Consol-based)的和基于窗口(Windows-based)的?;诳刂婆_(tái)程序它的入口函數(shù)是傳統(tǒng)的main,基于窗口的則是WinMain。這兩個(gè)入口函數(shù)一大區(qū)別是對(duì)于命令行參數(shù)的處理。 WinMain函數(shù)原型:int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow),LPSTR lpCmdLine存儲(chǔ)了命令行參數(shù)信息,MSDN對(duì)這參數(shù)解釋: 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. (指向一個(gè)應(yīng)用程序命令中,除了程序名的null字符結(jié)束的字符串。GetCommandLine函數(shù)可以返回整個(gè)命令行) 為了更清晰lpCmdLine是什么內(nèi)容,以下做一些測(cè)試。假設(shè)可執(zhí)行程序名:test.exe。 1、命令:test.exe (回車) lpCmdLine:0x00141f03 "" char * 注: 0x00141f03:lpCmdLine運(yùn)行時(shí)內(nèi)存地址 "":lpCmdLine內(nèi)容,這里值是空串 char *:lpCmdLine類型,它指出lpCmdLine是字符串。 命令行中沒任何參數(shù)。lpCmdLine是有效地址,但它是空字符串,即lpCmdLine[0]='\0'。因而程序要判斷命令行是不是帶參數(shù)不能用if (lpCmdLine)而應(yīng)該用if (lpCmdLine[0])。 2、命令:test.exe --config-dir Wesnoth1.7 (回車) lpCmdLine:0x00141f03 "--config-dir Wesnoth1.7" char * 命令行帶參數(shù),參數(shù)間有空格但沒有"符號(hào)。 3、命令:test.exe "--config-dir Wesnoth1.7" (回車) lpCmdLine:0x00141f03 ""--config-dir Wesnoth1.7"" char * 相比2,這里強(qiáng)行給參數(shù)加了"",可以看到lpCmdLine不對(duì)參數(shù)內(nèi)的""進(jìn)行處理,直接復(fù)制。 4、命令:test.exe "--config-dir "Wesnoth1.7" (回車) lpCmdLine:0x00141f03 ""--config-dir "Wesnoth1.7"" char * 相比于3,這里強(qiáng)行在中間加一個(gè)",這造成了""沒有配對(duì),但WinMain只是原樣復(fù)制而已。 WinMain的參數(shù)不像傳統(tǒng)的main函數(shù),會(huì)依著特殊字符得出兩個(gè)參數(shù)argv和argc,它就是除去可執(zhí)行文件字符串(加上后續(xù)空格符)的整個(gè)命令行作為一個(gè)字符串,直接給了lpCmdLine。
|