2014-03-06 45 views
2

我使用下面的代碼段...執行隱藏的命令行?

::_tsystem(_T("taskkill /F /T /IM MSC.exe")); 

然而,該代碼執行時CMD顯示!

如何在不顯示cmd的情況下使用此代碼?

謝謝。

+0

爲什麼要執行隱藏的命令,除非它是出於惡意目的。 –

+0

然後不要使用系統exec()類型的調用,而是直接與相關的Windows API調用進行通信。 –

+0

@JesusRamos,它不是爲了惡意的目的,而是讓那些不害怕我的蹩腳方式殺死我的程序。 – Andrew

回答

3

::_tsystem()函數在內部使用CMD.EXE工具來運行您的命令,而CMD.EXE是一個控制檯程序,所以您不能阻止顯示控制檯窗口。

如果你想這樣做,你將不得不使用適當的Win32 API調用運行該程序:CreateProcess()。更令人費解的一點,但不要太多:

STARTUPINFO si; 
memset(&si, 0, sizeof(si)); 
si.cb = sizeof(si); 

PROCESS_INFORMATION pi; 
TCHAR cmd[] = _T("taskkill /F /T /IM MSC.EXE"); 

BOOL res = CreateProcess(NULL, 
     cmd, 
     NULL, NULL, 
     FALSE, CREATE_NO_WINDOW, 
     NULL, NULL, 
     &si, &pi); 
if (!res) 
    error(); 
else 
{ 
    CloseHandle(hProcess); 
    CloseHandle(hThread); 
} 

注意標誌CREATE_NO_WINDOW,以避免造成即使程序是一個控制檯類型的應用程序控制臺窗口。

並提防cmd參數!來自docs

此函數的Unicode版本CreateProcessW可以修改此字符串的內容。因此,該參數不能是指向只讀內存的指針(例如const變量或文字字符串)。如果此參數是一個常量字符串,則該函數可能會導致訪問衝突。

因此,您必須使用本地數組或字符(TCHAR []),永遠不會使用文字字符串。

另請注意,當函數成功時,PROCESS_INFORMATION結構返回兩個打開的句柄,一個用於新創建的進程,另一個用於其主線程。這是你的責任,關閉這些手柄,否則他們會泄漏。

此外,還可以使用pi.hProcess等待過程來完成:

WaitForSingleObject(pi.hProcess, INFINITE); 
+0

非常感謝。這工作..我注意到了,如果我需要等待進程完成,我必須在WaitForSingleObject(pi)之後調用'CloseHandle(..)' .hProcess,INFINITE);' –

3

你嘗試過這樣的:

::_tsystem(_T("cmd /Q /C taskkill /F /T /IM MSC.exe")); 

編輯

鑑於似乎沒有任何使用系統工作,ShellExecute是你最好的選擇。我認爲實施將是這個樣子:

::ShellExecute(NULL, NULL, L"taskkill", L"/F /T /IM MSC.exe", NULL, SW_HIDE); 
+0

是的,它仍然顯示:( – Andrew

+0

謝謝。第二個代碼對我來說工作正常。 –

2

我做了以下通過執行一個隱藏的命令提示符並行殺外部進程。

PROCESS_INFORMATION ProcessInfo; 
STARTUPINFO StartupInfo; 

LPSTR cmdArgs = "taskkill /F /T /IM MSC.exe"; 

StartupInfo.cb = sizeof(StartupInfo); 
     StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 
     StartupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE); 
     StartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
     StartupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE); 
     StartupInfo.wShowWindow = SW_HIDE; 

     CreateProcess(NULL,cmdArgs,NULL,NULL,false,NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,NULL,NULL,&StartupInfo,&ProcessInfo); 

享受。

+0

不錯的工作!但是請看看我的新答案,並提供一些你錯過的細節,而且,你不需要那些處理的東西。沒有重定向輸入和輸出 – rodrigo

0

我第二,你應該用CreateProcess的 - 但你絕對不應該直接使用它。爲什麼? 因爲CreateProcess()正在創建資源 (兩個句柄,一個用於進程,一個用於主線程) 需要在不再需要時以及在CreateProcess()成功後關閉。 CreateProcess()屬於構造函數和CloseHandle()(兩次)到析構函數中。 如果CreateProcess()失敗,則通過拋出一個異常來中止構造函數, 將返回GetLastError()的值,並且可能會有一個字符串解釋CreateProcess()失敗。此異常類型應將錯誤代碼轉換爲系統錯誤字符串。

請留下您的C語言編程理念。 使用C++而不是C!