프로세스가 살아있는지 검사
// uses 에 TlHelp32 추가
function IsRunningProcess(const ProcName: String) : Boolean;
var
Process32: TProcessEntry32;
SHandle: THandle;
Next: Boolean;
var
Process32: TProcessEntry32;
SHandle: THandle;
Next: Boolean;
begin
Result:=False;
Process32.dwSize:=SizeOf(TProcessEntry32);
SHandle :=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
SHandle :=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
// 프로세스 리스트를 돌면서 매개변수로 받은 이름과 같은 프로세스가 있을 경우 True를 반환하고 루프종료
if Process32First(SHandle, Process32) then begin
repeat
Next:=Process32Next(SHandle, Process32);
if AnsiCompareText(Process32.szExeFile, Trim(ProcName))=0 then begin
Result:=True;
break;
end;
until not Next;
end;
CloseHandle(SHandle);
end;
if Process32First(SHandle, Process32) then begin
repeat
Next:=Process32Next(SHandle, Process32);
if AnsiCompareText(Process32.szExeFile, Trim(ProcName))=0 then begin
Result:=True;
break;
end;
until not Next;
end;
CloseHandle(SHandle);
end;
// 사용예. 계산기(calc.exe)가 떠있는지 확인하고 싶을 경우
procedure TForm1.Button1Click(Sender: TObject);
begin
if IsRunningProcess('calc.exe') then OutputDebugString('계산기 있음')
else OutputDebugString('계산기 없음');
end;
프로세스 죽이기 (강제종료)
// uses 에 TlHelp32 추가
function KillProcess(const ProcName: String): Boolean;
var
Process32: TProcessEntry32;
SHandle: THandle;
Next: Boolean;
hProcess: THandle;
i: Integer;
var
Process32: TProcessEntry32;
SHandle: THandle;
Next: Boolean;
hProcess: THandle;
i: Integer;
begin
Result:=True;
Result:=True;
Process32.dwSize :=SizeOf(TProcessEntry32);
Process32.th32ProcessID:=0;
SHandle :=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Process32.th32ProcessID:=0;
SHandle :=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
// 종료하고자 하는 프로세스가 실행중인지 확인하는 의미와 함께...
if Process32First(SHandle, Process32) then begin
repeat
Next:=Process32Next(SHandle, Process32);
if AnsiCompareText(Process32.szExeFile, Trim(ProcName))=0 then break;
until not Next;
end;
CloseHandle(SHandle);
if Process32First(SHandle, Process32) then begin
repeat
Next:=Process32Next(SHandle, Process32);
if AnsiCompareText(Process32.szExeFile, Trim(ProcName))=0 then break;
until not Next;
end;
CloseHandle(SHandle);
// 프로세스가 실행중이라면 Open & Terminate
if Process32.th32ProcessID<>0 then begin
hProcess:=OpenProcess(PROCESS_TERMINATE, True, Process32.th32ProcessID);
if hProcess<>0 then begin
if not TerminateProcess(hProcess, 0) then Result:=False;
end
// 프로세스 열기 실패
else Result:=False;
if Process32.th32ProcessID<>0 then begin
hProcess:=OpenProcess(PROCESS_TERMINATE, True, Process32.th32ProcessID);
if hProcess<>0 then begin
if not TerminateProcess(hProcess, 0) then Result:=False;
end
// 프로세스 열기 실패
else Result:=False;
CloseHandle(hProcess);
end // if Process32.th32ProcessID<>0
else Result:=False;
end;
end // if Process32.th32ProcessID<>0
else Result:=False;
end;
// 사용예. 계산기(calc.exe) 프로세스를 죽이고자 할 때.
procedure TForm1.Button1Click(Sender: TObject);
begin
if KillProcess('calc.exe') then OutputDebugString('계산기 죽이기 실패. 계산기 프로세스가 없었거나...')
else OutputDebugString('계산기 죽이기 성공.');
end;
'Delphi' 카테고리의 다른 글
Windows Data Type 과 Object Pascal Data Type (0) | 2009.04.18 |
---|---|
[Delphi] 숫자를 소리로 알림 (0) | 2009.04.18 |
[Delphi] TPopupMenu 에 관하여 (0) | 2009.04.18 |
[Delphi] HTML 페이지의 태그 사이를 유랑하기 (0) | 2009.04.18 |
[Delphi] 바이너리 파일을 텍스트로 읽어들이기 (0) | 2009.04.18 |