Q&A

  • process 죽이기 부탁드립니다.
windows 98에서는 이렇게 process를 죽였습니다
procedure Th00011of.Process32List(Slist: TStrings);
var   Process32: TProcessEntry32;
      SHandle:   THandle;  // the handle of the Windows object
      Next:      BOOL;

begin
   Process32.dwSize := SizeOf(TProcessEntry32);
   SHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);

   if Process32First(SHandle, Process32) then
   begin
      // 실행화일명과 process object 저장
      Slist.AddObject(Process32.szExeFile, TObject(Process32.th32ProcessID));
      repeat
          Next := Process32Next(SHandle, Process32);
          if Next then
          begin
             Slist.AddObject(Process32.szExeFile , TObject(Process32.th32ProcessID));
          end
      until not Next;
   end;

   CloseHandle(SHandle);  // closes an open object handle
end;

procedure Th00011of.FormClose(Sender: TObject; var Action: TCloseAction);
var   hProcess: THandle;
      ProcId:   DWORD;
      TermSucc: BOOL;
      i : integer;
begin
     ListBox1.Items.Clear;
     Process32List(ListBox1.Items);
     Process32Kill;
end;

procedure Th00011of.Process32Kill;
var   hProcess: THandle;
      ProcId:   DWORD;
      TermSucc: BOOL;
      i : integer;
begin

   // 현재 실행중인 process를 kill
   for i := 0 to ListBox1.items.count - 1 do
   begin
     if (UPPERCASE(copy(ListBox1.Items[i],1,9)) =  'C:\Test\')
        and (copy(ListBox1.Items[i],length(ListBox1.Items[i]) - 11,4) <> 'H000') Then
     begin
       ProcId   := DWORD(ListBox1.Items.Objects[i]);
       hProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, ProcId);
       if hProcess = NULL then
          ShowMessage('OpenProcess error !');
       TermSucc := TerminateProcess(hProcess, 0);
       if TermSucc = FALSE then
         ShowMessage('TerminateProcess error !');
     end;

   end;
end;



win98 에서는 Process32.szExeFile  로 Path 및 FileName을 얻을 수 있어서
c:\test에서 실행된 Process를 모두 찾아 죽일 수 있었는데
XP에서 Process32.szExeFile 는 File이름만 나오는 군요
XP에서 특정 Directory에서 실행된 또는 특정 조건의 Process를 모두 죽이고 싶은데 방법 었을까요?
1  COMMENTS
  • Profile
    최용일 2004.05.28 19:34
    안녕하세요. 최용일입니다.

    NT계열에서는 아래와 같이 하시면 ProcessID에 해당하는 프로그램패스를 구할 수 있습니다.

    function GetWindowFileNameNT(ProcessID: DWORD): string;
    var
        ProcessHandle: THandle;
        FileName: array [0..Max_Path - 1] of char;
    begin
        Result := '';
        ProcessHandle := OpenProcess(Process_Query_Information or Process_VM_Read, False, ProcessID);
        if ProcessHandle <> 0 then
        begin
            if GetModuleBaseName(ProcessHandle, 0, FileName, SizeOf(FileName)) > 0 then
                Result := FileName;
            CloseHandle(ProcessHandle);
        end;
    end;

    ^^ 항상 즐코하세요...