我使用下面的代碼段...執行隱藏的命令行?
::_tsystem(_T("taskkill /F /T /IM MSC.exe"));
然而,該代碼執行時CMD顯示!
如何在不顯示cmd的情況下使用此代碼?
謝謝。
我使用下面的代碼段...執行隱藏的命令行?
::_tsystem(_T("taskkill /F /T /IM MSC.exe"));
然而,該代碼執行時CMD顯示!
如何在不顯示cmd的情況下使用此代碼?
謝謝。
::_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);
非常感謝。這工作..我注意到了,如果我需要等待進程完成,我必須在WaitForSingleObject(pi)之後調用'CloseHandle(..)' .hProcess,INFINITE);' –
你嘗試過這樣的:
::_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);
是的,它仍然顯示:( – Andrew
謝謝。第二個代碼對我來說工作正常。 –
我做了以下通過執行一個隱藏的命令提示符並行殺外部進程。
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);
享受。
不錯的工作!但是請看看我的新答案,並提供一些你錯過的細節,而且,你不需要那些處理的東西。沒有重定向輸入和輸出 – rodrigo
我第二,你應該用CreateProcess的 - 但你絕對不應該直接使用它。爲什麼? 因爲CreateProcess()正在創建資源 (兩個句柄,一個用於進程,一個用於主線程) 需要在不再需要時以及在CreateProcess()成功後關閉。 CreateProcess()屬於構造函數和CloseHandle()(兩次)到析構函數中。 如果CreateProcess()失敗,則通過拋出一個異常來中止構造函數, 將返回GetLastError()的值,並且可能會有一個字符串解釋CreateProcess()失敗。此異常類型應將錯誤代碼轉換爲系統錯誤字符串。
請留下您的C語言編程理念。 使用C++而不是C!
爲什麼要執行隱藏的命令,除非它是出於惡意目的。 –
然後不要使用系統exec()類型的調用,而是直接與相關的Windows API調用進行通信。 –
@JesusRamos,它不是爲了惡意的目的,而是讓那些不害怕我的蹩腳方式殺死我的程序。 – Andrew