c++ system()和WinExec()的區別
區別1.
system是c庫的函式
區別2.
system有一個引數,是命令列
Winexec有兩個引數,一個是命令列,一個是視窗顯示
區別3.
雖然兩個都是命令列,但有很大的區別
Winexec的命令列引數一般是一個外部程式的路徑加給這個程式的引數,如
Winexec("D:\\notepad.exe 1.txt",WM_SHOWWINDOW);
system的命令列引數其實是給cmd程式的引數,system執行的時候是呼叫cmd程式,
假設system(“D:\\notepad.exe 1.txt“);程式執行時是呼叫cmd -c D:\notepad.exe 1.txt;
系統就會啟動cmd程式,由它執行。所以system的引數就是cmd -c後所對應的引數
(cmd -c 後面應該接什麼可以通過cmd /?檢視),因此system可以使用"cd E:\"這樣的引數,cmd會認識它,
但winexec就不認識。因為沒有cd這個程式存在,其實cd只不過是cmd自定義的一個命令。
有時候用winexec和system呼叫同樣的程式,會有不同的結果,
winexec("\"D:\\program files\\notaped.exe\" \"D:\\my document\\1.txt\"",WM_SHOWWINDOW); system("\"D:\\program files\\notaped.exe\" \"D:\\my document\\1.txt\"",);
看起來兩個一樣,但執行不一樣
winexec可以正常執行,但system會報錯,說找不到路徑什麼的或引數錯誤。
為什麼呢?因為system的引數給cmd,cmd會用自己的方法解析引數(cmd幫助裡有說明),
cmd 當碰到一對雙引號時,它會把雙引號裡面的東西提取出來,當有多對雙引號時,
它就會用其他方法來解析(老實說我也沒看懂它的幫助裡關於多對雙引號解析的邏輯,如果你看懂了,麻煩告訴我一聲)。
那麼怎麼解決上面的問題呢,很簡單,在所有引數外面再包一對雙引號
system("\"\"D:\\program files\\notaped.exe\" \"D:\\my document\\1.txt\"\"",);
這樣cmd只會去除首尾的雙引號,不做其他解析
區別4.
winExec是不同步的程序呼叫,就是呼叫起來了就返回了,不會等呼叫起來的程式結束
system是同步呼叫程序,呼叫程序不結束,它就不返回,它可以獲取呼叫程序所返回的值