2012-12-10 67 views
2

我試圖用CreateProcess函數來執行一個DOS命令:CreateProcess的執行Windows命令

LPWSTR cmd=(LPWSTR)QString("C:\\windows\\system32\\cmd.exe subst " + DLetter+" \""+mountPath+"\"").utf16(); 



     STARTUPINFO si; 
     PROCESS_INFORMATION pi; 
     ZeroMemory(&si, sizeof(si)); 
     si.cb = sizeof(si); 
     ZeroMemory(&pi, sizeof(pi)); 

     if (CreateProcessW(0,  // Application name 
          cmd,     // Application arguments 
          NULL, 
          NULL, 
          TRUE, 
          0, 
          NULL, 
          L"C:\\windows\\system32",   // Working directory 
          &si, 
          &pi) == TRUE) 
     { ... 

給它的最後一個錯誤3 = ERROR_PATH_NOT_FOUND,當我從命令分離應用程序的路徑"C:\\windows\\system32\\cmd.exe"它顯示控制檯不執行我的subst命令。

任何幫助將不勝感激。

+1

你可以調用'DefineDosDevice()'哪個(非持久地)做同樣的事情 –

回答

5

您需要在cmd.exe的選項中包含/ C或/ K。

 
/C  Carries out the command specified by string and then terminates 
/K  Carries out the command specified by string but remains 

沒有一個這些選項,你通過subst命令會被忽略。

話雖如此,至少在我的Windows 7盒子上,subst沒有在cmd.exe內部實現。它是一個單獨的可執行文件所以你可以直接調用它並完全繞過cmd.exe

關於您的來電CreateProcess我有以下意見:

  1. 不包括路徑C:\\windows\\system32。只需調用subst.exe並讓系統使用標準搜索路徑找到可執行文件。
  2. 通過FALSEbInheritHandles。您沒有將任何句柄傳遞給新進程,因此您不需要新進程來繼承您的句柄。
  3. 通過NULL作爲工作目錄。這裏沒有必要指定它。
+0

謝謝大衛它的工作我用我的參數調用subst.exe,但我沒有找到裝有C:/和D:/,沒有運行管理員權限,這就是爲什麼我沒有找到我的新驅動器?(我是一個簡單的用戶) – Oumaya

+0

我不確定。我認爲這是一個不同的問題。 –

+3

@DavidHeffernan:更好的是,不要使用'subst'可執行文件來操縱驅動器映射。直接使用Win32 API函數,比如'DosDefineDevice()','WNetAddConnection ...()','WNetCancelConnection ...()'等。 –

1

使用

"C:\\windows\\system32\\cmd.exe /c subst " + DLetter+" \""+mountPath+"\"" 

,而不是嘗試。如果沒有/c/k,CMD將不會接受參數,除非您想在控制檯窗口中看到輸出,只需使用/c即可。

+0

@Downvoter? .... –

+0

不是我 - 但爲什麼兩個cmd的實例?另外第二個缺少/ c。 –

+0

@HarryJohnston謝謝,當我回答時這是一個錯字。 –