원하는 프로세스 찾기 / 프로세스 경로 얻기
1. 원하는 프로세스를 찾기 위해서 ToolAPI를 이용해야 합니다. 이를 위해서는 TlHelp32 유닛을 사용합니다. 다음은 현 시스템의 모든 프로세스 목록을 얻는 예제입니다.
uses ... , TlHelp32, ... ;
procedure TMainForm.btnGetProcessListClick(Sender: TObject);
var
AProcessEntry32:LPPROCESSENTRY32;
hProcessSnap:THandle;
blnNext:BOOL;
i:integer;
begin
ClearProcessList;
hProcessSnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
try
New(AProcessEntry32);
AProcessEntry32^.dwSize:=SizeOf(TProcessEntry32);
blnNext:=Process32First(hProcessSnap, AProcessEntry32^);
while blnNext do
begin
lbProcessList.AddItem(AProcessEntry32^.szExeFile,TObject(AProcessEntry32));
New(AProcessEntry32);
AProcessEntry32^.dwSize:=SizeOf(TProcessEntry32);
blnNext:=Process32Next(hProcessSnap, AProcessEntry32^);
end;
finally
Dispose(AProcessEntry32);
CloseHandle(hProcessSnap);
end;
end;
CreateToolHelp32Snapshot API가 원하는 프로세스를 구하기 위한 핵심입니다. CreateToolHelp32Snapshot API를 이용하여 스냅샷을 얻어서 프로세스를 하나하나 리스트뷰어 추가해 줍니다.
TProcessEntry32.szExeFile 을 참조하여 원하는 프로세스를 찾을 수 있습니다.
2. 프로세스 경로 얻기
1. 번에서 원하는 프로세스를 찾을 경우, TProcessEntry32.th32ProcessID 값으로 프로세스의 ID를 알 수 있습니다. 이 ProcessID로 프로세스의 전체 파일 경로는 다음과 같은 함수로 얻을 수 있습니다. 이 함수를 이용하기 위해서는 PsAPI 유닛을 추가해 주어야만 합니다.
uses ... , PsAPI, ... ;
function GetPathFromProcessID(AProcessID:DWORD): string;
var
AProcessHandle:THandle;
szFileName: array [0..MAX_PATH-1] of char;
MH: THandle;
begin
Result:='';
AProcessHandle:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,false,AProcessID);
if (AProcessHandle<>0) then
begin
if (GetModuleFileNameEx(AProcessHandle,0,szFileName,MAX_PATH)>0) then
Result:=szFileName;
CloseHandle(AProcessHandle);
end;
end;
혹은 ProcessID를 이용하여 ToolAPI의 ModuleFirst 함수를 이용하여 모듈에 대한 실행 경로를 얻을 수도 있습니다.