http://blog.csdn.net/tangaowen/article/details/6436053
進程啟動命令行中怎么傳遞帶空格的參數
一般我們在一個exe里面啟動另外一個exe使用 ShellExecute 命令函數:
比如下面的代碼:
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);

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


{
strIniPath=argv[1];
}
那么,我們從上面的代碼可以得出,命令行參數為argc-1個,都放在argv這個數組中,其中 argv[0] 是程序本身的執行路徑,所以argc>=1 .
我們通過argv[1]就可以獲得第一個命令行參數,比如上面的代碼,我們就獲得了傳遞過來的命令行參數為D:/config.ini 。
但是,當我改變傳遞的命令行參數的內容為D:/Program Files/config.ini的時候
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程序對命令行參數的解析出問題了,解析的結果為:D:/Program,而且argc=3,顯然,程序把我的一個參數“D:/Program Files/config.ini”解析為兩個參數:
argv[1]="D:/Program" , argv[2]="Files/config.ini" 了。
這是個比較嚴重的bug ,那么怎么告訴系統我傳遞的是一個帶有空格的參數,而不是多個參數呢?
解決方法:
可以使用下面的代碼:
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);
將要傳遞的參數用"/"" 和 "/"" 給包起來,然后傳遞給ShellExecute就不會出現問題了。