我正在使用以下代码......
::_tsystem( _T("taskkill /F /T /IM MSC.exe") );
但是,执行此代码时会显示cmd!
如果没有显示cmd,我该如何使用此代码?
感谢。
答案 0 :(得分: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);
答案 1 :(得分: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);
答案 2 :(得分: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);
享受。
答案 3 :(得分:0)
我说你应该使用CreateProcess - 但你绝对不应该直接使用它。为什么? 因为CreateProcess()正在创建资源 (两个句柄,一个用于进程,一个用于主线程) 需要在不再需要时以及CreateProcess()成功后关闭。 CreateProcess()属于构造函数,而CloseHandle()(两次)属于析构函数。 如果CreateProcess()失败,您通过抛出异常来中止构造函数, whicb传递了GetLastError()的返回值,并且可能是一个解释CreateProcess()失败的字符串。此异常类型应将错误代码转换为系统错误字符串。
请保留此C编程理念。 使用C ++而不是C!