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를 모두 죽이고 싶은데 방법 었을까요?
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;
^^ 항상 즐코하세요...