1. 程式人生 > >c++ system()和WinExec()的區別

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是同步呼叫程序,呼叫程序不結束,它就不返回,它可以獲取呼叫程序所返回的值