주신 소스를 테스트 할 수가 없군요 Help File을 아무리 보아도 UNIT에 있는 TIHELP32라는 UNIT는 존재하지 않구요 또한 PROCEDUR process32list에 있는 선언부에 사용하신 TProcessEntry32 OBJECT도 없어요 부탁드릴께요 다시 연락주세요...
김영대
•
1999.07.15 03:27
안류진 께서 말씀하시기를...
> 주신 소스를 테스트 할 수가 없군요
> Help File을 아무리 보아도 UNIT에...
> 주신 소스를 테스트 할 수가 없군요
> Help File을 아무리 보아도 UNIT에 있는 TIHELP32라는 UNIT는 존재하지 않구요
> 또한 PROCEDUR process32list에 있는 선언부에 사용하신 TProcessEntry32
> OBJECT도 없어요
> 부탁드릴께요 다시 연락주세요
> 혹시 제가 전화를 할 수 있다면 연락처도 좀 가르쳐 주세요
> 그럼 부탁드립니다.
Toolhelp32 (Unit TlHelp32.pas) 는 SourceRTLWIN 에 있습니다
Windows 95 와 Windows NT 에서 프로세스 처리 방법은 다릅니다
아래를 참고하세요
기본적으로 Toolhelp32 (Unit TlHelp32) 가 제공됩니다
Toolhelp32 는 현재 실행중인 프로세스 리스트의 정보를 제공하는데
현재 실행중인 프로세스의 파일명, 프로세스 ID, 각 쓰레드 ID 등을
얻을 수 있으며 threadID 를 가지고 EnumThreadWindows() 함수를 사용하시면
원도우 핸들을 구할 수 있습니다
반대로 원도우 핸들을 가지고 GetWindowThreadProcessID() 함수를 사용하시면
프로세스와 쓰레도 ID 를 구할 수 있습니다
(예제) - 현재 실행된 프로세스중 선택한 프로세스 종료시키기
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, TlHelp32;
type
TForm1 = class(TForm)
ListBox1: TListBox;
B_Search: TButton;
B_Terminate: TButton;
procedure B_SearchClick(Sender: TObject);
procedure B_TerminateClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// kernel32.dll을 사용하여 현재 떠있는 process를 읽어온다
procedure 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
Slist.AddObject(Process32.szExeFile, TObject(Process32.th32ProcessID));
until not Next;
end;
CloseHandle(SHandle); // closes an open object handle
end;
procedure TForm1.B_SearchClick(Sender: TObject);
begin
// 현재 실행중인 process를 검색
ListBox1.Items.Clear;
Process32List(ListBox1.Items);
end;
procedure TForm1.B_TerminateClick(Sender: TObject);
var
hProcess: THandle;
ProcId: DWORD;
TermSucc: BOOL;
begin
// 현재 실행중인 process를 kill
if ListBox1.ItemIndex < 0 then System.Exit;
ProcId := DWORD(ListBox1.Items.Objects[ListBox1.ItemIndex]);
// 존재하는 process object의 handle을 return한다
hProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, ProcId);
if hProcess = NULL then
ShowMessage('OpenProcess error !');
// 명시한 process를 강제 종료시킨다
TermSucc := TerminateProcess(hProcess, 0);
if TermSucc = FALSE then
ShowMessage('TerminateProcess error !')
else
ShowMessage(Format('Process# %x terminated successfully !', [ProcId]));
end;
end.
Windows 95 에서 제공하는 Toolhelp32 (Unit TlHelp32)는 NT 에서 사용할 수
없습니다
소문으로는 NT5.0 에 Toolhelp32 를 넣는다고는 하는데...
NT에서는 두가지 방법으로 프로세스 정보를 구할 수 있습니다
첫째는 레지스트리의 HKEY_PERFORMANCE_DATA 섹션을 읽는 방법인데
이것은 동적인 레지스트리라 regedit.exe 로는 볼 수 없고
그것에 맞는 레지스트리 API 를 사용해서 접근할 수 있습니다
제가 개인적으로 NT에서 프로세스 관리 프로그램을 만들때 처음에
이 방법으로 했었는데 정보를 읽는 속도가 너무 느렸습니다
이 방법보다는 아래 PSAPI.DLL 을 사용하는것을 추천합니다
두번째 방법은 PSAPI.DLL 을 이용하는 방법입니다
PSAPI.DLL 는 공식적으로 문서화 되어있지 않으며 PSAPI.DLL 이 시스템
디렉토리에 없는 NT 버전(서비스팩)도 있습니다
아래 사이트에 보시면 관련 콤포넌트와 PSAPI.DLL 이 있습니다
http://www.wilsonc.demon.co.uk/delphi.htm <-- 추천
http://www.santronics.com