首页
社区
课程
招聘
[讨论]TerminateProcess结束多个同名进程和多个进程
发表于: 2012-6-16 08:24 20044

[讨论]TerminateProcess结束多个同名进程和多个进程

2012-6-16 08:24
20044
使用TerminateProcess结束其他进程,通常的作法是(1)建立快照,获得目标进程的pid;(2)调用TerminateProcess结束对方。
贴出代码如下:

BOOL KillProcess(LPSTR szProcessName)
{
        DWORD dwPid;
        HANDLE hProcess;
        char szShow[BUFSIZE];
        DWORD dwExitCode;

        while(1)
        {
                dwPid = FindProcess(szProcessName);

                if(dwPid == -1)
                {
                        break;
                        wsprintf(szShow,"Error to find process %s, pid %d",szProcessName,dwPid);
                //        MessageBox(NULL,szShow,"error",MB_OK|MB_ICONERROR);
                       
                }

                hProcess = OpenProcess(PROCESS_ALL_ACCESS,TRUE,dwPid);
                if(hProcess == NULL)
                {
                        wsprintf(szShow,"Error to open process with error code %d",GetLastError());
                //        MessageBox(NULL,szShow,"error",MB_OK|MB_ICONERROR);
       
                        return -1;
                }
       
        //        printf("%d",++i);
                //terminate it
                if(!TerminateProcess(hProcess,GetExitCodeProcess(hProcess,&dwExitCode)))
                {
                //        wsprintf(szShow,"Error to terminate process with error code %d",GetLastError());
                //        MessageBox(NULL,szShow,"error",MB_OK|MB_ICONERROR);
                }

                CloseHandle(hProcess);
        //        Sleep(500);
        }

        return 1;
}

DWORD FindProcess(LPSTR szProcessName)
{
  PROCESSENTRY32 pe32 = {0};
   HANDLE hSnapshot;
  pe32.dwSize=sizeof(PROCESSENTRY32);

  hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建快照

  while (Process32Next(hSnapshot,&pe32)) //遍历进程信息
  {
    if(lstrcmpi(pe32.szExeFile,szProcessName)==0)
    {
      return pe32.th32ProcessID;
    }
  }
  return -1;
}

但是遇到多个同名进程时,如同时打开多个notepad.exe,这时如果结束全部进程,一个方法是使用上面的while(1)。 如果结束两个不同的进程,就调用两次KillProcess方法。 但是在实际的实验过程中,发现有时候可以完全结束进程,有时候只能结束一个。
请教。。。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
2
有些进程有主次之分,如果主进程完蛋了,次进程也会一起结束的。

最好的方法是
while(FindProcess(szProcessName))
{
OpenProcess
TerminateProcess
}
2012-6-16 09:38
0
雪    币: 329
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这种方法好像也有问题  不能全部终止进程,要不是OpenProcess报错,就是TerminateProcess报错。很少能全部终止的。

不过我试验了下面的方法是可以的:

void FindKillProcess(LPSTR szProcessName)
{
        DWORD dwPid;
        HANDLE hProcess;
        char szShow[BUFSIZE];
        DWORD dwExitCode;

        PROCESSENTRY32 pe32 = {0};
    HANDLE hSnapshot;
    pe32.dwSize=sizeof(PROCESSENTRY32);

    hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //´´½¨¿ìÕÕ

   while (Process32Next(hSnapshot,&pe32)) //±éÀú½ø³ÌÐÅÏ¢
   {
     if(lstrcmpi(pe32.szExeFile,szProcessName)==0)
     {
        dwPid = pe32.th32ProcessID;

                hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid);
                if(hProcess == NULL)
                {
                        wsprintf(szShow,"Error to open process with error code %d",GetLastError());
                //        MessageBox(NULL,szShow,"error",MB_OK|MB_ICONERROR);
                }

                //terminate it
                if(!TerminateProcess(hProcess,GetExitCodeProcess(hProcess,&dwExitCode)))
                {
                //        wsprintf(szShow,"Error to terminate process with error code %d",GetLastError());
                //        MessageBox(NULL,szShow,"error",MB_OK|MB_ICONERROR);
                }

                CloseHandle(hProcess);
     }
   }
}

欢迎继续讨论啊
2012-6-16 12:44
0
雪    币: 20928
活跃值: (4125)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
/////////////////////////
//     Method 1:     //
////////////////////////
while(FindProcess(szProcessName)!=-1) /// Findprocess return -1 if not found
{
OpenProcess
TerminateProcess
}

DWORD FindProcess(LPSTR szProcessName)
{
  PROCESSENTRY32 pe32 = {0};
   HANDLE hSnapshot;
  pe32.dwSize=sizeof(PROCESSENTRY32);

  hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建快照

    Process32First(hSnapshot,&pe32);  //**** add this statement **** ///

  do   {
    if(lstrcmpi(pe32.szExeFile,szProcessName)==0)
    {
      CloseHandle(hSnapshot);
      return pe32.th32ProcessID;
    }
  } while (Process32Next(hSnapshot,&pe32)) ; // ****use do while***//

    CloseHandle(hSnapshot);
   return -1;
}


////////////////////////
////   Method 2:  ///
///////////////////////
while(FindProcess(szProcessName)) // findprocess return 0 if not found
{
OpenProcess
TerminateProcess
} 

DWORD FindProcess(LPSTR szProcessName)
{
  PROCESSENTRY32 pe32 = {0};
   HANDLE hSnapshot;
  pe32.dwSize=sizeof(PROCESSENTRY32);

  hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建快照

    Process32First(hSnapshot,&pe32);  //**** add this statement **** ///

  do   {
    if(lstrcmpi(pe32.szExeFile,szProcessName)==0)
    {
      CloseHandle(hSnapshot);
      return pe32.th32ProcessID;
    }
  } while (Process32Next(hSnapshot,&pe32)); // ****use do while***//

    CloseHandle(hSnapshot);
    return 0;// ****  -1 ==> 0  *****//
}
2012-6-16 12:55
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
悄悄的告诉你  
FindProcess 有句柄泄漏哦~~
2012-6-16 13:12
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
ULONG 
FindProcessId(WCHAR *ProcessName)
{
	HANDLE hSnap;
	PROCESSENTRY32 pe32;
	ULONG PID = 0;
	BOOL bStat;

	hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	if (INVALID_HANDLE_VALUE == hSnap)
	{
		printf("CreateToolhelp32Snapshot Failure...\n");
		return 0;
	}

	pe32.dwSize = sizeof(pe32);
	bStat = Process32First(hSnap,&pe32);
	if (!bStat) 
	{
		printf("Process32First Failure...\n");
		return 0;
	}

	while (Process32Next(hSnap,&pe32))
	{
		if (_wcsicmp(ProcessName,pe32.szExeFile) == 0)
		{
			PID = pe32.th32ProcessID;
			break;
		}
	}

	CloseHandle(hSnap);

	return PID;
}

BOOL
TerminatProcessByPid(ULONG PID)
{
	HANDLE hProcess= OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
	if (INVALID_HANDLE_VALUE == hProcess)
	{
		printf("OpenProcess Failure...\n");
		return FALSE;
	}

	BOOL bStat = TerminateProcess(hProcess,0);
	if (bStat)
	{
		printf("TerminateProcess Successful...\n");
		CloseHandle(hProcess);
		return TRUE;
	} else {
		printf("TerminateProcess Failure...\n");
		return FALSE;
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	while (1)
	{
		if (TerminatProcessByPid(FindProcessId(L"notepad.exe")))
		{
			printf("Kill Done!\n");
		} else {
			printf("Can't Kill Process :%d\n",FindProcessId(L"notepad.exe"));
		}
		Sleep(1000);
	}

	getchar();
	return 0;
}
2012-6-16 14:18
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
7
不是服务器程序,泄一点没关系。
2012-6-16 14:57
0
雪    币: 20928
活跃值: (4125)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
Please refer to level 4
2012-6-16 15:16
0
雪    币: 5
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
要关闭句柄,不然开久一点就很占PF
2012-6-16 22:30
0
雪    币: 546
活跃值: (1682)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
10
泻多了就痿了,,要养成好习惯
2012-6-17 07:54
0
游客
登录 | 注册 方可回帖
返回
//