2012-02-02 93 views
8

我有包含此代碼窗口服務:即使進程存在,Process.WaitForExit爲什麼會拋出「無進程」異常?

public static void ExtractTextInner(string source, string destination) 
    { 
     ProcessStartInfo startInfo = new ProcessStartInfo(); 
     startInfo.FileName = EXTRACTOR_EXE_FILEPATH 
     startInfo.Arguments = "\"" + source + "\" \"" + destination + "\""; 
     startInfo.CreateNoWindow = true; 
     startInfo.WindowStyle = ProcessWindowStyle.Hidden; 

     Process process = new Process(); 
     process.StartInfo = startInfo; 

     process.Start(); 
     process.WaitForExit(); 
     int exitCode = process.ExitCode; 
     process.Close(); 
     if (exitCode != 0) 
     { 
      switch (exitCode) 
      { 
       case 1: 
       throw new ApplicationException("IFilter Extraction Failed"); 
       default: 
       throw new ApplicationException("Unknown Exit Code:" + exitCode.ToString()); 
      } 
     } 
    } 

這段代碼的目的是運行在一個文檔中,我們使用一個單獨的過程,因爲一些IFilter的是出了名的片狀的IFilter提取物。

現在,此代碼在Windows 7和Server 2008 R2盒子上運行得非常好,但在Windows Server 2003上,WaitForExit立即拋出「沒有與此Process對象關聯的進程」異常。這個過程確實存在並且完成了它的任務,沒有任何問題。

任何人看到這?任何人都可以闡明爲什麼WaitForExit會拋出這個錯誤?

附加信息

如果我把在一個控制檯應用程序代碼並運行它正常工作的WINDWS Server 2003的箱爲好,因此它似乎是在一個服務運行此特定問題一個Windows Server 2003框。

+0

這很難用這段代碼解釋。修補程序與服務設置。確保「與桌面交互」選項已關閉。在應用程序事件日誌中發佈任何內容。 – 2012-02-02 11:49:59

+1

當你沒有得到處理過程的句柄(因此不能等待它)時會發生錯誤。確保您指定UseShellExecute = false,以防止重用流程。你也可以描述服務與可執行文件的比特率是32還是64?最後嘗試Process Monitor並查看它顯示的內容。 – Ben 2012-02-02 12:51:57

+0

@Hans:什麼都沒有出現任何事件日誌(至少沒有我的代碼不是故意放在那裏的)。我不確定在哪裏可以找到「與桌面交互」選項「 – AnthonyWJones 2012-02-02 12:51:57

回答

13

當啓動進程時,使用System.Diagnostics.Process類,系統可以使用CreateProcessShellExecuteEx Win32函數。當使用CreateProcess時,只能啓動可執行文件。使用ShellExecuteEx時,可以使用shell中的「開始 - >運行」命令啓動任何文件。

但是,這些是啓動過程的完全不同的方式。 ShellExecuteEx涉及到shell,並且可以通過使用存儲在HKCR\<progid>\shell\<verb>註冊表項下的信息重新使用Word或Excel的現有實例來打開文檔。這可能涉及例如使用DDE搜索並激活現有的Excel實例。

ShellExecuteExSHELLEXECUTEINFO查看文檔:

注意ShellExecuteEx可能會或可能不會返回依賴於一個新的進程是否已啓動的hProcess。這是你所看到的行爲。

CreateProcess是一個較低級別的函數,它直接創建一個進程,並簡單地傳遞等價參數。它總是返回一個進程句柄。

注:既然你似乎開始一個可執行文件,它是一個有點出人意料,沒有hProcessShellExecuteEx返回。儘管如此,如果你想確保你得到一個進程句柄,使用UseShellExecute = false是正確的。

相關問題