您的位置:首页 > 其它

《Windows程序设计》[第二版] - 第2章 Win32程序运行原理 - 关闭指定名称的进程

2010-04-03 19:31 393 查看
《Windows程序设计》[第二版] - 第2章 Win32程序运行原理 - 关闭指定名称的进程

#include <stdio.h>
#include <windows.h>
#include <TlHelp32.h>
int TerminateProcessName(const char* szProcessName, UINT uExitCode, LPDWORD lpdwProcessID)
{
/* A. 根据进程名字获取进程ID */
DWORD dwProcessID = 0;
PROCESSENTRY32 pe32;
// 使用这个结构之前先设置它的大小
pe32.dwSize = sizeof(pe32);
// 给系统内的所有进程拍一个快照
HANDLE hProcessSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnapshot == INVALID_HANDLE_VALUE)
{
//printf(" CreateToolhelp32Snapshot 调用失败!/n");
return -1;
}
// 遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnapshot, &pe32);
while (bMore)
{
//printf("/n 进程名称:%s /n", pe32.szExeFile);
//printf(" 进程ID号:%u /n", pe32.th32ProcessID);
if (strcmp(pe32.szExeFile, szProcessName) == 0)
{
dwProcessID = pe32.th32ProcessID;
}
bMore = ::Process32Next(hProcessSnapshot, &pe32);
}
::CloseHandle(hProcessSnapshot);
if (dwProcessID == 0)
{
//printf(" 没有找到进程名为%s的进程/n", szProcessName);
return -2;
}
if (lpdwProcessID != NULL)
{
*lpdwProcessID = dwProcessID;
}
/* B. 根据进程ID获取进程句柄 */
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
if (hProcess == INVALID_HANDLE_VALUE)
{
//printf(" 获取进程ID号为%d的进程句柄失败 /n", dwProcessID);

return -3;
}
/* C. 根据进程句柄关闭进程 */
BOOL bRet = ::TerminateProcess(hProcess, uExitCode);
::CloseHandle(hProcess);
if (bRet)
{
return 0;
}else{
return -4;
}
}
int main(int argc, char* argv[])
{
char szProcessName[] = "QQ.exe";
DWORD dwProcessID;
int iRet = TerminateProcessName(szProcessName, 99, &dwProcessID);
if (iRet != 0)
{
printf("失败,失败原因:%d /n", ::GetLastError());
}else{
printf("成功/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: