這兩者之間的主要區別是什麼?我願意只從我的(C++)應用程序運行另一個EXE。在繼承環境,安全特性等方面有什麼不同嗎?CreateProcess和ShellExecute的區別
回答
CreateProcess
和ShellExecute
之間的主要區別是:CreateProcess
更面向上的高的用戶控制桿,其看到在瀏覽器中的用戶水平低和ShellExec
。
例如使用CreateProcess
可以使用長度多於MAX_PATH
的命令行。它有32,768個字符限制。您還可以使用CreateProcess
在另一個Windows桌面上(如登錄屏幕上)啓動程序(如果您擁有足夠的權限)。
另一個例子。例如,您可以使用ShellExecute
來啓動控制面板或打開計算機上存在的用於編輯JPG字段的任何程序。因此,您使用ShellExecute
接近Windows資源管理器中的相應操作。
CreateProcess不能啓動一個進程,如果路徑該程序在MAX_PATH上。它可以傳遞很長的參數給一個可以開始的程序,但這是不同的。基本上,目前沒有辦法開始一個比MAX_PATH更深的程序(除非有一個短的8.3等效) – nikos
@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
@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
主要區別在於靈活性。 ShellExecute
更易於使用,但沒有太大的靈活性。 CreateProcess
是一個痛苦的使用,但可以讓你做任何事情。
僅舉例而言,使用CreateProcess
,您可以指定用於子級中的標準輸入/輸出/錯誤流的句柄(管道或文件)。 ShellExecute
不會讓你想要做到這一點。
它可能還值得一提的是,雖然ShellExecute
可以直接用來啓動一個可執行文件,它的主要目的是「執行」文件文件 - 例如,告訴它「執行」一「whatever.html」 ,它會啓動您的默認Web瀏覽器並將指定的HTML文件加載到其中。您也可以使用CreateProcess
來做到這一點,但要做到這一點,您(通常)首先調用FindExecutable
來查找與該數據文件關聯的程序,然後執行將數據文件作爲參數傳遞的方法。
CreateProcess
返回該啓動的進程句柄和ID,以及它在PROCESS_INFORMATION
結構主線程
- 1. CreateProcess和CreateProcessA有什麼區別?
- 2. WinExec和ShellExecute之間的區別是什麼?
- 3. windows編程中的_spawnl和Createprocess(...)API有什麼區別?
- 4. 用於createProcess函數的DETACH_PROCESS和CREATE_NO_WINDOW進程創建標誌有什麼區別
- 5. 模擬和CreateProcess
- 6. 路徑和CreateProcess
- 7. 來自內存緩衝區的CreateProcess
- 8. +和CONCAT的區別?
- 9. Win32 ShellExecute和UNC路徑
- 10. 德爾福:shellexecute和sw_hide
- 11. 區別「」和
- 12. 區別://和http:\\
- 13. 的CreateProcess和0xc0000142錯誤
- 14. 的ShellExecute在_beginthread
- 15. C++與ShellExecute的
- 16. 之間的〜/和的區別../
- 17. JQuery.Post()的目的和區別
- 18. 區別:android:background和android:src?
- 19. 區別使用[和[
- 20. 區別Await.ready和Await.result
- 21. ASCII和Unicode區別
- 22. 區別:Riak.mapValuesJson()和JSON.parse()
- 23. 區別:ID/*和@ + ID/*
- 24. LXML xpath.//和//區別
- 25. 區別GetDesktopWindow()和HWND_DESKTOP
- 26. 區別webcontent和webapp
- 27. 區別! !和= JavaScript中
- 28. 類區域和堆之間的區別
- 29. Cassandra中節點和分區的區別
- 30. Vuforia文本識別和OCR的區別?
的[MSDN文檔(http://msdn.microsoft.com)給你這個信息。對於SO來說,這個問題完全過於模糊而且不具體。有幾十個問題可以討論這兩個問題,而且你已經完全沒有表現出努力來自己研究這個問題。 (作爲提示:只有一個允許你指定關於環境的任何東西,繼承句柄和其他信息,我將留給你的研究能力來確定哪一個。) –