《Windows程序设计》[第二版] - 第2章 Win32程序运行原理 - 关闭指定名称的进程
<textarea cols="50" rows="15" name="code" class="cpp">#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; }</textarea>