2008-11-05 66 views
2

我有一個問題關於我濫用CreateProcess的症狀。我正在使用lpcommandline參數將路徑提供給我的可執行文件和參數。我的誤用是我沒有用引號括起exe文件的路徑。路徑和CreateProcess

我的問題是,爲什麼CreateProcess在大多數計算機上工作得很好而不是其他人?我知道這條道路在大多數時間裏都有空間,但是它在90%的XP機器上工作。我當然在那10%的地方發現了我的問題。但是我想知道哪些機器不起作用會有什麼不同?有沒有一個設置或政策,你們任何人都知道。是的,我要解決報價問題。只是好奇爲什麼這樣的事情不會失敗。

所以代碼如下所示,szCommandLine參數如下所示。注意到exe文件的路徑沒有引號。

「C:\ Program Files文件\我的公司\ doit.exe參數1參數」

CreateProcess(
    NULL,   
    szCommandLine, 
    NULL,   
    NULL,   
    FALSE,   
    NULL, 
    NULL, 
    NULL,   
    &si,    
    &pi)  

回答

3

你應該閱讀此頁:如果應用程序名稱爲空
http://msdn.microsoft.com/en-us/library/ms682425.aspx

  • (第一參數)。
  • 它使用命令行中第一個空格分隔的字(第二個參數)作爲應用程序名稱。
  • 如果應用程序名稱包含空格,則必須引用該空格。

同樣的代碼是值得一萬個字:
它看起來是這樣的:

char commandline[] = "C:\Program Files\My Company\doit.exe parameter1 parameter2"; 
CreateProcess(NULL,commandline, ....); 

或者,您somwhere生成的路徑名?
記住一般問題只會給你通用的答案。
您必須先確定具體的答案,然後才能確定爲什麼只有太多的猜測。

+1

是的,我讀過。這就是我知道我搞砸了報價。這個問題涉及爲什麼即使沒有許多機器上的報價而不是其他機器上的報價。我已經解決了這個問題,我只是想知道是什麼導致了這種奇怪的行爲。 – DanG 2008-11-05 18:07:28

0

診斷類似問題的一個好方法是內置到您的應用程序錯誤和報告機制中。這有助於實現這麼多目的 - 主要針對您可能永遠不會看到自己的錯誤以及哪些用戶可能會忽略並不向您報告。通過這種方式,您可以診斷命令被調用併發生故障時的參數。

此外,您可以嘗試進一步探索MSDN網站和與此方法關聯的高級功能。你留下他們大部分爲NULL。通過探索這些擴展功能,您將學習並可能找出自己爲什麼會有這種差異。

另一個通用的答案,但我希望這可以幫助你評估你的特定情況。

5

正如文檔Martin York所暗示的那樣,CreateProcess()對於使用前長名稱程序的back-compat有一些行爲。

「C:\ Program Files文件\子目錄\程序名ARG1 ARG2」 將尋找:

"c:\program.exe" files\sub dir\program name arg1 arg2 
"c:\program files\sub.exe" dir\program name arg1 arg2 
"c:\program files\sub dir\program.exe" name arg1 arg2 
"c:\program files\sub dir\program name.exe" arg1 arg2 

因此,如果這些文件的存在,Windows會打電話給他們,而不是你程序。另外,如果您沒有讀取這些可能匹配的文件夾的讀取權限,CreateProcess()可能立即失敗,而不是檢查您是否已經閱讀了以後可能的匹配項。 (Windows默認只讀取最終文件夾的讀取權限。)

2

我剛剛在同一個問題上掙扎了很長時間。因此,即使這個問題很久以前就提出了,但爲了記錄,這裏是我的情況:

如果命令行未被引用且包含空格,CreateProcess將嘗試將不明確性解決爲在Simon的回答中有所描述。 如果任何達到空格字符的測試部件也解析爲擴展名爲.exe或.exe的現有文件,則將使用此文件而不是預期的完整路徑。

例子:

char cmdline[] = "C:\Program Files\App One\bin\app.exe param1 param2"; 
CreateProcess(NULL, cmdline, ...); 

不幸的竟是所謂的 「C:\ Program Files文件\應用程序」 的現有文件(沒有擴展名)在我的情況。 CreateProcess找到了這個文件,認爲它是一個沒有擴展名爲.exe的可執行文件,並試圖執行它。結果:錯誤193「%1不是有效的Win32應用程序」。底線:使用引號或甚至更好,第一個參數爲CreateProcess,或者去尋找可能與違規路徑的一部分相匹配的任何其他文件。