WIN32 根据程序名(映像名称)终止外部程序

场景:

1.有时候需要调用外部程序,但是外部程序有可能崩溃挂起,这样这个进程就没法结束,所以再在下次调用前需要先结束之前调用的。

2.没考虑到权限问题,应该是只能终止当前用户启动的进程.

[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. #include <windows.h>  
  5. #include <Tlhelp32.h>  
  6.   
  7. #include <vector>  
  8.   
  9. void TerminateProcessByName(PCWSTR name)  
  10. {  
  11.     DWORD pid = 0;  
  12.       
  13.     // Create toolhelp snapshot.  
  14.     HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
  15.     PROCESSENTRY32W process;  
  16.     ZeroMemory(&process, sizeof(process));  
  17.     process.dwSize = sizeof(process);  
  18.   
  19.     std::vector<DWORD> pids;  
  20.     // Walkthrough all processes.  
  21.     if (Process32FirstW(snapshot, &process))  
  22.     {  
  23.         do  
  24.         {  
  25.             // Compare process.szExeFile based on format of name, i.e., trim file path  
  26.             // trim .exe if necessary, etc.  
  27.             if (!wcscmp(process.szExeFile, name))  
  28.             {  
  29.                pid = process.th32ProcessID;   
  30.                pids.push_back(pid);  
  31.             }  
  32.         } while (Process32NextW(snapshot, &process));  
  33.     }  
  34.   
  35.     CloseHandle(snapshot);  
  36.       
  37.     size_t size = pids.size();  
  38.     for(size_t i = 0; i < size; ++i)  
  39.     {  
  40.         HANDLE one_process = OpenProcess(PROCESS_TERMINATE, FALSE, pids[i]);  
  41.         BOOL res = TerminateProcess(one_process,0);  
  42.         if(res)  
  43.         {  
  44.             WaitForSingleObject(one_process,1000);  
  45.         }  
  46.     }  
  47. }  
  48.   
  49. int main(int argc, char *argv[])  
  50. {  
  51.     printf("Hello, world ");  
  52.       
  53.     std::vector<DWORD> pids;  
  54.     TerminateProcessByName(L"notepad.exe");  
  55.   
  56.     return 0;  
  57. }  
原文地址:https://www.cnblogs.com/lvdongjie/p/4838858.html