2012-05-25 61 views
6

這兩者之間的主要區別是什麼?我願意只從我的(C++)應用程序運行另一個EXE。在繼承環境,安全特性等方面有什麼不同嗎?CreateProcess和ShellExecute的區別

+1

的[MSDN文檔(http://msdn.microsoft.com)給你這個信息。對於SO來說,這個問題完全過於模糊而且不具體。有幾十個問題可以討論這兩個問題,而且你已經完全沒有表現出努力來自己研究這個問題。 (作爲提示:只有一個允許你指定關於環境的任何東西,繼承句柄和其他信息,我將留給你的研究能力來確定哪一個。) –

回答

11

CreateProcessShellExecute之間的主要區別是:CreateProcess更面向上的高的用戶控制桿,其看到在瀏覽器中的用戶水平低和ShellExec

例如使用CreateProcess可以使用長度多於MAX_PATH的命令行。它有32,768個字符限制。您還可以使用CreateProcess在另一個Windows桌面上(如登錄屏幕上)啓動程序(如果您擁有足夠的權限)。

另一個例子。例如,您可以使用ShellExecute來啓動控制面板或打開計算機上存在的用於編輯JPG字段的任何程序。因此,您使用ShellExecute接近Windows資源管理器中的相應操作。

+0

CreateProcess不能啓動一個進程,如果路徑該程序在MAX_PATH上。它可以傳遞很長的參數給一個可以開始的程序,但這是不同的。基本上,目前沒有辦法開始一個比MAX_PATH更深的程序(除非有一個短的8.3等效) – nikos

+0

@nikos:可以同時使用'lpApplicationName'和'lpCommandLine'來指定帶有參數的程序。 「lpCommandLine」的最大長度限制爲32,768個字符。您可以閱讀[文檔](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v = vs.85).aspx)「如果lpApplicationName爲NULL,模塊名稱lpCommandLine的一部分被限制爲MAX_PATH個字符。「通過使用非空'lpApplicationName'和'lpCommandLine',應該能夠指定長度大於MAX_PATH的模塊部分。我認爲應在路徑 – Oleg

+0

@nikos中使用「\\?\」前綴:此外,從Windows 10版本1607開始,MAX_PATH限制已從常用Win32文件和目錄函數中刪除(請參閱[初始公告] ://mspoweruser.com/ntfs-260-character-windows-10/)和[文檔](https:// msdn。microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath))。 – Oleg

4

主要區別在於靈活性。 ShellExecute更易於使用,但沒有太大的靈活性。 CreateProcess是一個痛苦的使用,但可以讓你做任何事情。

僅舉例而言,使用CreateProcess,您可以指定用於子級中的標準輸入/輸出/錯誤流的句柄(管道或文件)。 ShellExecute不會讓你想要做到這一點。

它可能還值得一提的是,雖然ShellExecute可以直接用來啓動一個可執行文件,它的主要目的是「執行」文件文件 - 例如,告訴它「執行」一「whatever.html」 ,它會啓動您的默認Web瀏覽器並將指定的HTML文件加載到其中。您也可以使用CreateProcess來做到這一點,但要做到這一點,您(通常)首先調用FindExecutable來查找與該數據文件關聯的程序,然後執行將數據文件作爲參數傳遞的方法。

2

CreateProcess返回該啓動的進程句柄和ID,以及它在PROCESS_INFORMATION結構主線程