Q&A

  • 윈도우 강제 종료시 실행중인 프로그램도 강제종료하기
안녕하세요



윈도우 종료와 관련 exitwindowsex 함수를 이용하여

몇가지 test해 보았지만 실행중인 아래아 한글이나, 네트워크 연결중일 때

저장 혹은 연결을 끊겠습니까 하는 식으로 물어 봅니다.



그런 물음없이 완전히 강제로 종료할 수 있는 방법 좀 가르쳐 주시겠습니까





exitwindowsex(ewx_shutdown,0); // 시스템 종료 => 물어봄



ewx_force,poweroff등등 다 시도했으나 원하는 결과는 없었습니다.

1  COMMENTS
  • Profile
    김영대 1999.09.03 23:35
    조계영 께서 말씀하시기를...

    > 안녕하세요

    >

    > 윈도우 종료와 관련 exitwindowsex 함수를 이용하여

    > 몇가지 test해 보았지만 실행중인 아래아 한글이나, 네트워크 연결중일 때

    > 저장 혹은 연결을 끊겠습니까 하는 식으로 물어 봅니다.

    >

    > 그런 물음없이 완전히 강제로 종료할 수 있는 방법 좀 가르쳐 주시겠습니까

    >

    >

    > exitwindowsex(ewx_shutdown,0); // 시스템 종료 => 물어봄

    >

    > ewx_force,poweroff등등 다 시도했으나 원하는 결과는 없었습니다.



    원도우즈 종료전에 떠있는 프로세스를 TerminateProcess 를 사용하여

    강제종료해 보세요

    하지만 현재 원도우즈에 실행중인 프로그램이 하던 동작을

    마무리 하지 못하고 TerminateProcess 하게되면 리소스 반납문제도

    있지만 워드문서를 저장도 안했는데 종료하면 사용자가 좀 당황하지

    않을까요...



    아래 예제는 선택된 Process 만 강제종료하는데 좀 고치면

    전체 프로세스를 종료하실 수 있을 겁니다



    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.