http://blog.csdn.net/tangaowen/article/details/6436053
進(jìn)程啟動(dòng)命令行中怎么傳遞帶空格的參數(shù)
一般我們?cè)谝粋€(gè)exe里面啟動(dòng)另外一個(gè)exe使用 ShellExecute 命令函數(shù):
比如下面的代碼:
std::string strExePath="D:/MyExe.exe";

std::string strMyParas="D:/config.ini";

ShellExecute(NULL, _T("open"), strExePath.c_str(), strMyParas.c_str(), NULL, SW_SHOWNORMAL);

要啟動(dòng)的exe位于D盤的根目錄下面,要傳遞的命令行參數(shù)為一個(gè)路徑:
D:/config.ini
那么在MyExe.exe里面怎么獲得傳遞過去的命令行參數(shù)呢,看下面的代碼:
int argc=0;
LPWSTR *argv=::CommandLineToArgvW(::GetCommandLineW(),&argc);
if(argc>=2)


{
strIniPath=argv[1];
}
那么,我們從上面的代碼可以得出,命令行參數(shù)為argc-1個(gè),都放在argv這個(gè)數(shù)組中,其中 argv[0] 是程序本身的執(zhí)行路徑,所以argc>=1 .
我們通過argv[1]就可以獲得第一個(gè)命令行參數(shù),比如上面的代碼,我們就獲得了傳遞過來的命令行參數(shù)為D:/config.ini 。
但是,當(dāng)我改變傳遞的命令行參數(shù)的內(nèi)容為D:/Program Files/config.ini的時(shí)候
std::string strExePath="D:/MyExe.exe";

std::string strMyParas="D:/Program Files/config.ini";

ShellExecute(NULL, _T("open"), strExePath.c_str(), strMyParas.c_str(), NULL, SW_SHOWNORMAL);

我的MyExe.exe程序?qū)γ钚袇?shù)的解析出問題了,解析的結(jié)果為:D:/Program,而且argc=3,顯然,程序把我的一個(gè)參數(shù)“D:/Program Files/config.ini”解析為兩個(gè)參數(shù):
argv[1]="D:/Program" , argv[2]="Files/config.ini" 了。
這是個(gè)比較嚴(yán)重的bug ,那么怎么告訴系統(tǒng)我傳遞的是一個(gè)帶有空格的參數(shù),而不是多個(gè)參數(shù)呢?
解決方法:
可以使用下面的代碼:
wstring strExePath=wstring(L"/"");
strExePath.append(strExePath);
strExePath.append(wstring(L"/""));

wstring strMyParas=wstring(L"/"");
strMyParas.append(strMyParas);
strMyParas.append(wstring(L"//"));
strMyParas.append(wstring(L"/""));

ShellExecute(NULL, _T("open"), strExePath.c_str(), strMyParas.c_str(), NULL, SW_SHOWNORMAL);
將要傳遞的參數(shù)用"/"" 和 "/"" 給包起來,然后傳遞給ShellExecute就不會(huì)出現(xiàn)問題了。