执行隐藏的命令行?

时间:2014-03-06 21:54:23

标签: c++ cmd

我正在使用以下代码......

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

但是,执行此代码时会显示cmd!

如果没有显示cmd,我该如何使用此代码?

感谢。

4 个答案:

答案 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!