프로그래밍/델파이

원하는 프로세스 찾기 / 프로세스 경로 얻기

채윤아빠 2007. 12. 22. 00:01
728x90
반응형

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 함수를 이용하여 모듈에 대한 실행 경로를 얻을 수도 있습니다.