STEP ONE
终止正在运行的进程,我们用TerminateProcess()函数,函数原型:
BOOL TerminateProcess(
HANDLE hProcess, // handle to the process
UINT uExitCode // exit code for the process
);
So,在这儿,我们需要获得需要终止的进程的句柄。
STEP TWO
因此,我们想到函数OpenProcess(),函数原型:
HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance flag
DWORD dwProcessId // process identifier
);
这样,问题转到获取进程ID。
STEP THREE
用CreateToolhelp32Snapshot()函数获得进程切片,然后通过函数Process32First()和Process32Next()依次获得进程信息(包括进程名和进程ID)。
各函数原型如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
BOOL WINAPI Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
BOOL WINAPI Process32Next(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
解释:
CreateToolhelp32Snapshot函数为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD])建立一个快照[snapshot]。
参数:
dwFlags
[输入]指定快照中包含的系统内容,这个参数能够使用下列数值(常量)中的一个或多个。
TH32CS_INHERIT - 声明快照句柄是可继承的。
TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。
TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的进程的所有的堆。
TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的进程的所有的模块。
TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。
TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
th32ProcessID
[输入]指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。
返回值:
调用成功,返回快照的句柄,调用失败,返回INVALID_HANDLE_VALUE 。
STEP FOUR
具体实现代码(附详细注释):
#include "stdafx.h"
#include <iostream>
#include <Tlhelp32.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //获取进程切片
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
std::cout << "获取系统进程切片失败" << std::endl;
return 1;
}
PROCESSENTRY32 pe32 = { sizeof(pe32) }; //保存进程切片的临时变量
if (!Process32First(hProcessSnap, &pe32)) //获取第一个进程切片
{
std::cout<<"获取切片进程失败"<<std::endl;
}
int i = 0;//进程计数
do //依次获取进程切片
{
++i;
char name[100] = {0}; //打印进程名
sprintf_s(name, "%d: %S",i, pe32.szExeFile);
std::cout << name << std::endl;
//找到Win32Project1.exe后,获取句柄,终止进程
if (0==_tcscmp(pe32.szExeFile,TEXT("Win32Project1.exe")))
{
HANDLE hGUI = OpenProcess(PROCESS_ALL_ACCESS, true, pe32.th32ProcessID);
if (NULL == hGUI)
{
std::cout << "获取进程句柄失败" << std::endl;
return 1;
}
TerminateProcess(hGUI, 0); //终止进程
}
} while (Process32Next(hProcessSnap, &pe32));
return 0;
}
另外一种有效的方法: