2012-02-28 12 views
7

私はこのプログラムを持っていますが、私がタスクマネージャーでそれを終了すると、私のプログラムで例外が発生し、クラッシュします。タスクマネージャは私のプログラムをどのように殺すのですか?

タスクマネージャからイベントを取得して、プロセスを終了してプログラムを正常に終了したい場合があります。

私は、プロセスを強制終了するためにタスクマネージャが使用しているメソッドはほとんどないことを理解しています。

1)アプリケーションタブから、誰かが私のアプリケーションのメインウィンドウにWM_CLOSEメッセージを送信していると言いました。そして、数秒後にアプリケーションがダウンしないと、タスクマネージャはそれを非応答として検出し、TerminateProcess ()をプロセスに適用します。

2)プロセスタブから、誰かがTerminateProcess()ウィンドウAPIを使用していると言ってきました。

他にタスクマネージャが使用している方法はありますか?

私は最後の2つの方法について正しいですか?

ありがとうございます。

答えて

8

はい、どちらも正しいです。正常に閉じるには、WM_CLOSEに応答する必要があります。これは、タスクマネージャー(シャットダウンなど)だけでなく、どこからでも来る可能性があります。

通常、MFCはWM_CLOSEを処理します。あなたのアプリケーションが応答していない場合、あなたのメインスレッドは何か他のことをする必要がありますか、またはあなたの説明の可能性がWM_CLOSEハンドラのどこかでクラッシュしている可能性があります。

例外を発生させる場所を見つけるためにアプリをデバッグできますか?

+1

ありがとう、私は実際にタスクマネージャによって送信されたWM_CLOSEメッセージに応答しませんでした。私は 'afx_msg void OnClose();のEMPTY実装を見つけました。私がしなければならなかったことは、OnCloseの基本クラスの実装を呼び出すことでした。 – eladyanai

1

WM_CLOSEを取得すると、そのアプリケーションを簡単に検出して、アプリケーションがそれに対応できるようにすることができます。

TerminateProcessがアプリケーションの終了時に呼び出されていることを知ることはできません。文書TerminateProcessは、ターゲットプロセスの即時かつ無条件のシャットダウンと言います。

(あなたはこれを実現したいどのくらいに応じて、Windows APIのにフックについてthis linkを見てみましょうが、それは簡単なことを期待しないでください。)

+0

あなたの答えをありがとう、実際には、私はWM_CLOSEには、タスクマネージャ - アプリケーションタブから自分のプロセスを殺すときに送信された応答しませんでした。 Processタブ(TerminateProcess関数による)から自分のプロセスを強制終了しても、アプリケーションがクラッシュすることはありませんでした。 – eladyanai

3

はい、これらはオプションです。

コンソールモードアプリケーションでは、「タスクの終了」ボタンがクリックされたときに反応する可能性のある送信が得られます。

TerminateProcessを傍受することはできません。あなたのプロセスは死んでしまい、それが起こる前にあなたができることは何もありません。実際には、pretty bad if you couldになります。そのため、結婚したプロセスを終了させる方法はありません。

+0

非常によく知っている!ありがとう、私はTerminateProcessの説明に同意します。 – eladyanai

1

タスクマネージャは内部でEndTask機能を使用します。この関数は、アプリケーションにWM_CLOSEメッセージを送信します。アプリケーションがそのメッセージに応答せず、ユーザーがアプリケーションを強制終了する場合は、TerminateProcessがプロセスに対して呼び出されます。

関連する問題