Q&A

  • 다른 프로그램이 죽었는지 살았는지 알 수 있을까요?
로빈군입니다.
다름이 아니오라, TTimer를 이용하여 주기적으로 특정 프로그램(내지는 프로세스)를 체크하여
해당 프로그램이 '응답 없음' 상태이면 그 프로그램을 강제적으로 종료한 후
재실행하는 프로그램을 만들려고 합니다.

그런데 두 가지 문제가 있는데.....
1. 모니터링할 프로세스(내지는 프로그램)을 어떻게 접근해야 할지
2. 해당 프로그램을 어떻게 하면 종료할 수 있을지
라는 문제가 있네요.

특히나 이번에는 해당 프로그램이 ActiveX DLL같은게 아니라 그냥 말 그대로 exe형태의 독립된 프로그램이라
CreateOLEObject같은 걸로 찾아내는건 힘들 것 같습니다.

위 두 가지 사항에 대해서
부디 미천한 초보자에게 자비를 베풀어주세요..... OTL
2  COMMENTS
  • Profile
    최지훈 2007.04.14 00:28
    먼저 모니터링할 프로세스는 Win Api중에 실행하는 명령어가 있는데 모니터링 프로그램이 실행될때
    실행시켜 주면 될꺼 같구요 해당 프로그램을 찾아서 (찾는건 Form 이름으로 찾는 등등 방법은 많아여)
    터미네이트 시켜주면 안될까요? 흠.. -_ a 비슷한걸 만든적이 잇는데 군대고 오래 되서 자료도 없고
    기억력 감퇴에 ㄷㄷㄷ; 도움이 될지 모르겠네요;


  • Profile
    마이크로김 2007.07.21 01:19


    근데 프로그램 응답없음으로 체크 하면 실행프로그램 처리중에 시간이 조금 걸리면
    응답없음으로 처리되어서 .......

    uses TlHelp32 추가

    function ProcessList( Str : String):Integer;
    var
            Process32       : TProcessEntry32;
            SHandle         : THandle        ;  // the handle of the Windows object
            Next            : BOOL           ;
    //        ProcId          : DWORD          ;
    begin
            result := 0;

            Process32.dwSize := SizeOf(TProcessEntry32);
            SHandle          := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);

            if Process32First(SHandle, Process32) then
            begin
            // 실행화일명과 process object 저장
                    repeat
                            Next := Process32Next(SHandle, Process32);
                            if Next then
                            begin
                                    if UpperCase(Process32.szExeFile) = UpperCase(Str) then
                                    begin
                                            result := result + 1;
                                    end;
                            end;
                    until not Next;
            end;

            CloseHandle(SHandle);  // closes an open object handle
    end;

    procedure Process32ListKill( Str : String);
    var
            Process32 : TProcessEntry32;
            SHandle   : THandle;  // the handle of the Windows object
            Next      : BOOL;
            ProcId    : DWORD;
    begin
            Process32.dwSize := SizeOf(TProcessEntry32);
            SHandle          := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);

            if Process32First(SHandle, Process32) then
            begin
                    // 실행화일명과 process object 저장
                    repeat
                            Next := Process32Next(SHandle, Process32);
                            if Next then
                            begin
                                    GetWindowThreadProcessID( SHandle, @ProcId );
                                    if UpperCase(Process32.szExeFile) = UpperCase(Str) then
                                    begin
                                            ProcId   := DWORD(Process32.th32ProcessID);
                                            SHandle := OpenProcess(PROCESS_ALL_ACCESS, TRUE, ProcId);
                                            // 명시한 process를 강제 종료시킨다
                                            TerminateProcess(SHandle, 0);
                                    end;
                            end;
                    until not Next;
            end;
            CloseHandle(SHandle);  // closes an open object handle
    end;