2012-02-28 5 views
7

나는이 MFC 프로그램을 가지고 있는데, 나는 태스크 매니저로 그것을 죽일 때 나는 나의 프로그램에 대한 예외를 얻었고 그때 그것은 충돌한다.작업 관리자가 내 프로그램을 어떻게 죽입니까?

내 프로세스를 죽이고 프로그램을 정상적으로 종료하려고 할 때 작업 관리자로부터 이벤트를 가져오고 싶습니다.

저는 프로세스를 죽이기 위해 작업 관리자가 사용하는 방법이 거의 없음을 알고 있습니다.

1) 응용 프로그램 탭에서 누군가 내 응용 프로그램의 기본 표시 창에 WM_CLOSE 메시지를 보냈다 고 말했고 응용 프로그램이 몇 초 후에 다운되지 않으면 작업 관리자가이를 응답으로 감지하고 TerminateProcess() 과정에.

2) 프로세스 탭에서 누군가가 TerminateProcess() windows API를 사용한다고 말했습니다.

작업 관리자가 사용하는 다른 방법이 있습니까?

바로 지난 두 가지 방법이 있습니까?

미리 감사드립니다.

답변

8

예, 둘 다 맞습니다. 정상적으로 닫으려면 WM_CLOSE에 응답해야합니다. 이것은 작업 관리자 (예를 들어 시스템 종료)가 아닌 어느 곳에서나 올 수 있습니다.

일반적으로 MFC는 WM_CLOSE를 처리합니다. 응용 프로그램이 응답하지 않으면 주 스레드가 다른 작업을 수행하거나 WM_CLOSE 처리기의 어딘가에서 설명이 충돌 할 가능성이 있습니다.

예외를 발생시키는 곳을 찾기 위해 앱을 디버그 할 수 있습니까?

+1

감사합니다. 정말 작업 관리자에서 보낸 WM_CLOSE 메시지에 응답하지 않았습니다. 나는'afx_msg void OnClose();의 EMPTY 구현을 발견했다. 기본 클래스의 OnClose 구현을 호출하면된다. – eladyanai

1

WM_CLOSE을 얻으면 쉽게 감지 할 수 있으므로 응용 프로그램이 WM_CLOSE를 처리 할 수 ​​있습니다.

언제 응용 프로그램을 죽이기 위해 TerminateProcess이 호출되는지 알 수 없다고 생각합니다. TerminateProcess 문서는 대상 프로세스를 즉각적으로 무조건 종료한다고 설명합니다.

(당신이 달성하고자하는 정도에 따라서는, 윈도우 API 후킹에 대해 this link에서 살펴하지만 쉽게 기대하지 않습니다.)

+0

답변을 주셔서 감사합니다. 실제로 WM_CLOSE에 응답하지 않았습니다. 응용 프로그램 탭에서 프로세스를 종료 할 때 작업 관리자가 보낸 것입니다. 프로세스 탭 (TerminateProcess 함수로)에서 내 프로세스를 종료해도 응용 프로그램이 중단되지 않았습니다. – eladyanai

3

예, 다음은 옵션입니다.

완전성을 위해 콘솔 모드 응용 프로그램은 "작업 끝내기"버튼을 클릭했을 때 반응 할 수있는 CTRL_CLOSE_EVENT 메시지를받습니다.

TerminateProcess을 가로 채거나 반응 할 수 없습니다. 당신의 과정은 죽을 것이고 당신은 그 일이 일어나기 전에 할 수있는 일이 없습니다. 실제로는 pretty bad if you could입니다. 왜냐하면 끔찍한 과정을 종결시킬 길이 없기 때문입니다.

+0

알아두면 좋은 정보! 고맙습니다. TerminateProcess 설명에 동의합니다. – eladyanai

1

작업 관리자는 내부적으로 EndTask 기능을 사용합니다. 이 함수는 응용 프로그램에 WM_CLOSE 메시지를 보냅니다. 응용 프로그램이 해당 메시지에 응답하지 않고 사용자가 응용 프로그램을 강제 종료하면 사용자 프로세스에서 TerminateProcess이 호출됩니다.