Q&A

  • 다른 프로그램을 죽이는 방법좀 알려주세요.
델파이로 어떤 특정 프로그램이 살아 있는지 , 살아 있으면

특정프로그램을 죽이는 방법이 있나요..

여러분의 도움을 요청합니다...

1  COMMENTS
  • Profile
    김영대 1999.07.28 01:27
    이현옥 께서 말씀하시기를...

    > 델파이로 어떤 특정 프로그램이 살아 있는지 , 살아 있으면

    > 특정프로그램을 죽이는 방법이 있나요..

    > 여러분의 도움을 요청합니다...



    전에 올렸던 내용인데 다시 올려드립니다

    아래 소스의 단점(?)은 TerminateProcess() 를 이용하여 프로세스를

    종료하면 해당 프로그램이 resource를 윈도우즈에 반납할 기회를

    가지지 못하므로 문제가 될 수 있습니다

    TerminateProcess() 를 이용하기 보다는 EnumWindows() 와

    SendMessage(handle, WM_CLOSE, 0, 0) 을 이용하시는것이 안전합니다

    제 홈페이지(http://myhome.shinbiro.com/~cozykyd/index.htm)의 Delphi Tip 에서 EnumWindows() 를 찾아보세요



    -------------------------------------------------------------------------

    다음 Delphi source는 process처리를 위한 예제프로그램을

    작성한 것입니다. (좀더 꾸미면 Task Manager가 되겠죠)

    리스트박스에 현재 실행중인 process를 보여준후

    선택한 process를 kill합니다. (kernel32.dll의 함수를 사용합니다)

    이 예제프로그램이 조금이나마 도움이 되었으면 합니다.

    의문사항은 메일주세요



    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.