본문 바로가기
Software/C++&MFC

프로세스 이름으로 PID 번호 구하기

by lovey25 2021. 8. 18.
반응형

이름으로 해당 프로세스의 PID 번호를 구하는 방법입니다.

위 작업 관리자 캡처 화면의 경우 Notepad.exe의 PID는 5528입니다. 그런데 이 번호는 메모장이 실행될 때마다 변경되기 때문에 PID가 필요한 경우 유용하게 사용할 수 있습니다.

#include <psapi.h>
#include <processthreadsapi.h>

DWORD GetProcessByFileName(LPWSTR name)
{
	DWORD process_id_array[1024];
	DWORD bytes_returned;
	DWORD num_processes;
	HANDLE hProcess;
	WCHAR image_name[MAX_PATH] = { 0, };
    
	DWORD i;
	EnumProcesses(process_id_array, 1024 * sizeof(DWORD), &bytes_returned);
	num_processes = (bytes_returned / sizeof(DWORD));
	for (i = 0; i < num_processes; i++) {
		hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, process_id_array[i]);
		if (GetModuleBaseName(hProcess, 0, image_name, 256)) {
			if (!wcscmp(image_name, name)) {
				CloseHandle(hProcess);
				return process_id_array[i];
			}
		}
		CloseHandle(hProcess);
	}
	return 0;
}

파라미터로 프로세스 이름을 넣어주면 해당되는 PID를 반환해 주는 함수입니다. 

함수의 로직은 시스템에 실행 중인 프로세스의 모든 PID 번호를 줄을 세운 다음 각 PID번호에 해당하는 프로세스 이름은 불러와서 찾는 이름과 동일한지 비교하고 원하는 프로세스를 찾았으면 PID를 반환하는 흐름입니다.

실행 중인 PID 번호를 나열하는 데는 EnumProcesses() 함수를 사용했습니다.  "psapi.h" 헤더에 정의된 함수로 동작에 문제가 있는 경우는 "0"이 반환되고 그렇지 않으면 파라미터 3개에 실행 중인 프로세스에 대한 정보가 저장됩니다.

프로세스의 이름을 얻기 위해서는 각각의 프로세스 핸들이 필요한데요. 핸들 값을 구하기 위해서 "OpenProcess()"함수를 사용합니다. 첫 번째 파라미터는 프로세스의 접근방법인데 보통 모든 권한을 허용하는 "PROCESS_ALL_ACCESS"를 사용합니다. 두 번째 파라미터는 해당 프로세스를 함수가 실행되는 프로세스에 상속할지를 결정합니다. 마지막 파라미터는 열고자 하는 프로세스의 ID 되겠습니다.

이렇게 얻은 프로세스 핸들을 이용해서 GetModuleBaseName() 함수로 프로세스 이름을 가져오고 마지막으로 wcscmp() 함수로 찾고자 하는 프로세스 이름인지 확인합니다.

 

끝!

반응형

댓글