programing

프로세스를 이름으로 죽이는 방법? (Win32 API)

elecom 2023. 10. 30. 20:33
반응형

프로세스를 이름으로 죽이는 방법? (Win32 API)

기본적으로 한 번 이상 시작되는 프로그램이 있습니다.따라서 프로그램이 시작되는 과정은 2개 이상이 될 것입니다.

Win32 API를 사용하여 특정 이름으로 모든 프로세스를 kill/종료하고 싶습니다.

저는 A 프로세스를 죽이는 예를 보았지만, 이름이 정확하게 같은 여러 프로세스가 아닌 다른 파라미터를 가진 예를 보았습니다.

아래 코드를 사용해 보십시오.killProcessByName()이름을 가진 모든 프로세스를 죽일 것입니다.filename:

#include <windows.h>
#include <process.h>
#include <Tlhelp32.h>
#include <winbase.h>
#include <string.h>
void killProcessByName(const char *filename)
{
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    PROCESSENTRY32 pEntry;
    pEntry.dwSize = sizeof (pEntry);
    BOOL hRes = Process32First(hSnapShot, &pEntry);
    while (hRes)
    {
        if (strcmp(pEntry.szExeFile, filename) == 0)
        {
            HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,
                                          (DWORD) pEntry.th32ProcessID);
            if (hProcess != NULL)
            {
                TerminateProcess(hProcess, 9);
                CloseHandle(hProcess);
            }
        }
        hRes = Process32Next(hSnapShot, &pEntry);
    }
    CloseHandle(hSnapShot);
}
int main()
{
    killProcessByName("notepad++.exe");
    return 0;
}

참고: 코드는 대소문자를 구분합니다.filename, 대소문자 구분 없이 편집할 수 있습니다.

저도 방금 비슷한 문제에 봉착했습니다.제가 생각해낸 것은...

void myClass::killProcess()
{
   const int maxProcIds = 1024;
   DWORD procList[maxProcIds];
   DWORD procCount;
   char* exeName = "ExeName.exe";
   char processName[MAX_PATH];

   // get the process by name
   if (!EnumProcesses(procList, sizeof(procList), &procCount))
      return;

   // convert from bytes to processes
   procCount = procCount / sizeof(DWORD);

   // loop through all processes
   for (DWORD procIdx=0; procIdx<procCount; procIdx++)
   {
      // get a handle to the process
      HANDLE procHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procList[procIdx]);
      // get the process name
      GetProcessImageFileName(procHandle, processName, sizeof(processName));
      // terminate all pocesses that contain the name
      if (strstr(processName, exeName))
         TerminateProcess(procHandle, 0);
      CloseHandle(procHandle);    
   }
}
void kill(std::string filename, int delay)
{
    filename += ".exe";
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    PROCESSENTRY32 pEntry;
    pEntry.dwSize = sizeof(pEntry);
    BOOL hRes = Process32First(hSnapShot, &pEntry);
    while (hRes) {
        if (filename.c_str() == pEntry.szExeFile) {
            HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, (DWORD)pEntry.th32ProcessID);
            if (hProcess != NULL) {
                TerminateProcess(hProcess, 9);
                CloseHandle(hProcess);
            }
        }
        hRes = Process32Next(hSnapShot, &pEntry);
    }
    CloseHandle(hSnapShot);
}

// usage
int main()
{
    kill("notepad");
}

이것이 오래되었다는 것을 알지만 2011년 답변의 문제점과 잘못된 관행에 대해 설명해야 할 것 같습니다.필요하지 않다면 c++로 c를 쓸 이유가 전혀 없습니다.std::string::c_str()이 이미 문자열에 포인터를 반환하므로 constchar 배열을 사용할 필요가 없습니다.내 토막에서 볼 수 있듯이...

    - filename은 더 이상 성소수자가 아니며, 네이티브 c++와 우수 관리자이기 때문에 문자열입니다.
    - strcmp check는 문자열 차이를 비교할 이유가 없으므로 제거됩니다.그 대신에 우리는 그들이 동등한지를 확인합니다.
    - 파일 이름에 .exe를 추가하여 .exe 없이 프로세스 이름을 입력할 수 있습니다.
There is simply no reason to write c in c++ unless its mandatory.

언급URL : https://stackoverflow.com/questions/7956519/how-to-kill-processes-by-name-win32-api

반응형