具体的情况如下:
比如我们执行如下命令:sc
这个时候cmd.exe就会创建一个sc进程
我现在想的如何可以在他们执行超时的情况下结束掉cmd和SC这两个进程
CMD的进程还好结束,因为他的是我们直接创建的
可以直接用TerminateProcess(pi.hProcess,0);
但是由他创建的sc这个进程又如何结束呢
我这里提供一点示例代码:
-----------------------
strcat(SystemDir,"dllcache\\cmd.exe /c ");
strcat(SystemDir,cmdstr);//cmdstr是我们自己输入的命令
         CreateProcess(NULL,SystemDir,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi);
        if(pi.dwProcessId != 0)
{
DWORD cout,dwRead;
if(::WaitForSingleObject(pi.hThread,10000) == WAIT_TIMEOUT)
TerminateProcess(pi.hProcess,0);
---------------------------------------------------------------------------
上面的代码也只能在超时后结束掉cmd这个进程
结束不了由他创建的子进程
希望大牛帮忙看一下

解决方案 »

  1.   

    枚举进程快照,找到你想要结束的进程名,获取它的PID调用OpenProcess打开进程,获得HANDLE,再用TerminateProcess结束它
    #include <tlhelp32.h>
    TCHAR *szFileName = _T("xxx.exe");
    CString str;
    PROCESSENTRY32 pe;
    HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    pe.dwSize = sizeof(PROCESSENTRY32);
    if (::Process32First(hSnapShot, &pe ))
    {
    do
    {
    if (_tcsicmp(pe.szExeFile, szFileName) == 0)
    {
    HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
    if( hProcess != NULL)
    {
    if(::TerminateProcess(hProcess, 0))
    {
    str.Format(_T("%s已经被成功Killed!"), szFileName);
    MessageBox(str);
    break;
    }
    else
    {
    str.Format(_T("终止进程%s失败!"), szFileName);
    MessageBox(str);
    break;
    }
    }
    else
    {
    str.Format(_T("无法访问进程%s!"), szFileName);
    MessageBox(str);
    break;
    }
    }
    }
    while(::Process32Next(hSnapShot,&pe));
    }
      

  2.   

    关键是cmdstr是一个变量呀
    并且不知道一定要运行外部程序
    这个程序还可以执行一般的系统命令
    比如:dir c:\
    如果这些东西超时的话直接结束CMD就OK了
    但是有时又是外部命令
    所以不好区分 
    还有就是通过名字来结束进程好象容易出现误杀的情况
      

  3.   

    为啥不直接CreateProcess那个cmdstr?
      

  4.   

    但是直接如果用cmdstr怎么运行系统内部命令呢
    比如执行dir c:\
    这样就不能正常运行了
      

  5.   

    既然知道cmdstr,得到进程名有何难处?而且cmd.exe的PID也知道,而PROCESSENTRY32 pe;里pe.th32ParentProcessID就是该进程的父ID,你可以判断一个进程的父ID是否为你刚才创建的cmd.exe,这样就不会被误杀了