第一部分:
根据进程名获取进程ID。
首先我们需要了解三个windows API函数:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
CreateToolhelp32Snapshot函数可以得到系统进程快照的句柄,如果函数调用成功返回快照句柄,否则返回INVALID_HANDLE_VALUE。函数包含在<tlhelp32.h>头中。
BOOL WINAPI Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
Process32First函数查找系统进程快照中的第一个进程。
BOOL WINAPI Process32Next(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
Process32Next函数配合Process32First函数通过循环列出系统中其它进程。
查找特定进程的ID的函数如下所示:
/*
*@brief 根据进程名获取进程ID
@param lpProcessName进程名称
*/
DWORD __getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID
{
DWORD dwRet = 0;
HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapShot == INVALID_HANDLE_VALUE)
{
printf("\n获得进程快照失败,返回的GetLastError():%d", ::GetLastError());
return dwRet;
}
PROCESSENTRY32 pe32;//声明进程入口对象
pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小
::Process32First(hSnapShot, &pe32);//遍历进程列表
do
{
if (!lstrcmp(pe32.szExeFile, lpProcessName))//查找指定进程名的PID
{
dwRet = pe32.th32ProcessID;
break;
}
} while (::Process32Next(hSnapShot, &pe32));
::CloseHandle(hSnapShot);
return dwRet;//返回
}
第二部分
通过进程名来终止进程。
还是通过上面三个函数来查找特定的进程,不过还需要另外两个函数:
HANDLE OpenProcess(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId
);
OpenProcess函数用来打来一个进程。
BOOL TerminateProcess(
HANDLE hProcess,
UINT uExitCode
);
TerminateProcess用来终止给定的进程。
实例如下:
/*
*@brief 根据进程名终止进程
@param lpProcessName进程名称
*/
BOOL __getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID
{
BOOL processExist = true;
HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapShot == INVALID_HANDLE_VALUE)
return processExist;
PROCESSENTRY32 pe32;//声明进程入口对象
pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小
::Process32First(hSnapShot, &pe32);//遍历进程列表
do
{
if (!lstrcmp(pe32.szExeFile, lpProcessName))//查找指定进程名的PID
{
HANDLE hGUI = OpenProcess(PROCESS_ALL_ACCESS, true, pe32.th32ProcessID);
if (NULL == hGUI)
return processExist;
TerminateProcess(hGUI, 0);
processExist = false;
break;
}
} while (::Process32Next(hSnapShot, &pe32));
::CloseHandle(hSnapShot);
return processExist;//返回
}