반응형
프로세스를 이름으로 죽이는 방법? (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 없이 프로세스 이름을 입력할 수 있습니다.
언급URL : https://stackoverflow.com/questions/7956519/how-to-kill-processes-by-name-win32-api
반응형
'programing' 카테고리의 다른 글
| C에서 이와 같은 번호를 정렬하려면 어떻게 해야 합니까? (0) | 2023.10.30 |
|---|---|
| findViewById()는 다른 구성 요소가 아닌 레이아웃 XML의 사용자 지정 구성 요소에 대해 null을 반환합니다. (0) | 2023.10.30 |
| C: 문자열을 연결하는 가장 빠르고 좋은 방법은 무엇입니까? (0) | 2023.10.30 |
| 열별로 그룹화된 것을 색인으로 만들지 않고 그룹화하는 판다. (0) | 2023.10.30 |
| B 트리와 B+ 트리의 차이점은 무엇입니까? (0) | 2023.10.30 |