2011-04-18 48 views
0

我一直在使用CreateProcess Win API,我想知道使用lpApplicationName和lpCommandLine作爲參數v.s的區別是什麼。只是lpCommandLine參數。CreateProcess - lpApplicationName vs lpCommandLine

例如:

CreateProcess(NULL, L"C:\Path\To\Notepad.exe", L"C:\Path\To\File\To\Load.txt"... etc 
CreateProcess(NULL, NULL, L"C:\Path\To\Notepad.exe C:\Path\To\File\To\Load.txt"... etc 

我假定第二選項,其中僅lpCommandLine用於將像開放的cmd.exe和運行確切的行。但是第一行呢,是加載應用程序並以不同的方式指定命令行參數?

我已經看過API的MSDN文檔,但它似乎並沒有真正詳細說明發生了什麼,那些參數可以包含哪些內容,這很好,但我只是對我應該做的事感到困惑在有多種方式的時候做。

請注意,我知道兩個示例行可能無法正常工作,因爲lpCommandLine需要LPTSTR而不是LPCTSTR。它只是爲了便於理解。

非常感謝您的幫助!

Andy

+0

什麼讓你說MSDN沒有詳細解釋發生了什麼上?它幾乎沒有更多的細節。用三個詞來說,lpApplicationName或多或少的確實是你所要求的,而不是更多,而lpCommandLine增加了很多解釋和魔法(附加擴展,搜索PATH等)。而且,就像約翰說的那樣,通常最好的方法是使用兩者。 – Damon 2011-04-18 17:52:17

+0

好吧,也許有一些細節,我不明白/第一次錯過,但它仍然感覺有點模糊。 – Andy 2011-04-19 07:41:54

回答

3

推薦的方法是使用這兩個參數。如果您不指定lpApplicationName,則讓Windows分析lpCommandLine以找出應用程序名稱。由於空間是文件名和目錄名中的有效字符,因此這可能(極少數情況下)導致應用程序運行錯誤。 (例如,如果您有c:\ program.exe,並且您在Windows XP中的c:\ program files下啓動一個程序)。

在這兩種情況下,您都應該在lpCommandLine中使用應用程序名稱,因爲這用於計算Argv [0]。

+0

推薦的方法是僅使用命令行,併爲* lpApplicationName *參數傳遞'NULL'。如果應用程序名稱包含空格,則需要引用該名稱。如果您需要將非標準命令行(一個不包含可執行映像的路徑名作爲第一個參數)傳遞給正在創建的進程,請僅使用這兩個參數。 – IInspectable 2015-10-03 19:26:53

+0

@IInspectable,你基於什麼建議?閱讀MSDN頁面中有關「安全注意事項」的CreateProcess,然後描述該問題......「爲避免此問題,請勿爲lpApplicationName傳遞NULL,如果您確實爲lpApplicationName傳遞NULL ...」。因此,微軟建議不要傳遞NULL,但如果你確實使用了引號。 – John 2015-10-06 21:54:09

+1

該建議基於邏輯推理。大多數應用程序期望啓動進程的可執行映像作爲第一個參數('argv [0]')。對於這些情況,傳遞* lpCommandLine *就足夠了,並且可以防止生成重複的冗餘信息。傳遞* lpApplicationName *和* lpCommandLine *都允許構建一個命令行,該命令行不包含可執行映像作爲其第一個參數。它應該用於那些罕見的情況,應用程序需要一個(非標準)命令行,但沒有可執行映像作爲其第一個參數。 – IInspectable 2015-10-07 08:20:40

0

According to MSDNlpApplicationName是可選的,可以是NULL。在這種情況下,模塊名稱必須是lpCommandLine字符串中第一個以空格分隔的標記。

如果可執行模塊是16位應用程序,則lpApplicationName應該爲NULL,並且由lpCommandLine指向的字符串應該指定可執行模塊及其參數。

2

我從來沒有使用lpApplicationName始終引用lpCommandLine的應用部分,在你的榜樣,我只是使用lpApplicationName可能會導致訪問的argv [0子進程的問題將執行"C:\Path\To\Notepad.exe" "C:\Path\To\File\To\Load.txt"(報價傳遞給CreateProcess的所有路徑是一個好主意) ]這就是爲什麼我遠離它。


<rant> 上比自己以外的任何使用CreateProcess的是有問題的,因爲NT6 +可以在任何時候決定,你正在執行的事情需要,因爲應用程序兼容性墊片和/或安裝程序檢測,然後CreateProcess的只是失敗的管理員權限。除非你需要使用調試或脫離工作標誌,否則我建議只是調用ShellExecute [Ex]以確保安全... </rant>

+0

關於我們使用ShellExecute的最後一點很有意思,那就是我們最初使用的,但是我們必須移動到創建過程,因爲Adobe Reader需要指定當前用戶的環境塊(所以它在用戶文檔文件夾而不是系統配置文件中查找) ,我不認爲你可以用ShellExecute來做到這一點。如果我們使用shell執行和Adobe Reader是默認處理程序,它會加載,但只是崩潰,因爲它拒絕訪問systemprofile文件夾。有什麼建議麼? :) – Andy 2011-04-19 07:39:19

+0

@安迪:這是一個咆哮。不要認真對待。真正的問題是執行隨機字符串,例如從註冊表中,不知道他們指向什麼。如果你不知道你在執行什麼,那麼可以,你可以嘗試啓動安裝程序。至於啓動Adobe Reader,這是'ShellExecute'的一個明確的例子。不要試圖猜測我用作PDF閱讀器的內容。我沒有使用Adobe,部分原因是它很麻煩。 – MSalters 2011-04-19 08:17:16