私は、.NET 4.0(c#)で書かれたWindowsコンソールアプリケーションを持っています。アプリケーション/プロセスが異常終了した場合(例えば、タスクマネージャやオペレーティングシステムのシャットダウンなど)、これを傍受してクリーンアップコードを実行できましたか?Windows(.NET)のプロセス「Kill」コマンドをインターセプトする方法はありますか?
ありがとうございました。
私は、.NET 4.0(c#)で書かれたWindowsコンソールアプリケーションを持っています。アプリケーション/プロセスが異常終了した場合(例えば、タスクマネージャやオペレーティングシステムのシャットダウンなど)、これを傍受してクリーンアップコードを実行できましたか?Windows(.NET)のプロセス「Kill」コマンドをインターセプトする方法はありますか?
ありがとうございました。
あり
は、一般的に殺されているプロセスを処理するために、どのような方法ではありませんが、イベントを処理することができるはずです。これらの事象を検出する方法の良い例があるWin32.SystemEventsを見てみましょうアプリケーションの終了時に発生します。 (ちょうど考えて:あなたがプロセスが殺されることができるなら、恐ろしいスパイウェアタイプのものを書くのは本当に簡単でしょう)。私が正しく覚えていれば、アプリがなぜ閉鎖しているのかをチェックする方法があります。何が原因で終了するかによって、あなたは異なった反応をすることができます。
自分のプロセスが強制終了されていることを検出できません。誰かがあなたのプロセスでNtTerminateProcess()を呼び出し、そのようなアクセス権を持っていると、あなたは知らされません。あなたのスレッドはすべて停止し、プロセスはあなたの下から消えます。
ありがたいことに、ほとんどのクリーンアップは手動で行う必要はありません。フリーズしていないメモリはすべてOSによって再利用されます。クローズしなかったシステムハンドルはすべて自動的にクリーンアップされます。 TEMPORARYとして開いたすべての一時ファイル(あなたはそうしていますか?)は自動的に削除されます。
理由は簡単です。あなたがタスクマネージャーを介してプログラムを殺すことを決めた場合、それはユーザーが誤動作していると判断したためです。あなたが不正行為を止めるように指示すれば、それはあなたを無視するかもしれません。なぜなら、それは間違っているからです。
プロセス管理を行うより良い方法は、プロセスを終了するための正当な方法を提供することです.WM_CLOSEイベントを処理するウィンドウを経由するか、コンソールで実行することができます。角の赤いXボタンを使って打ち切ります。タスクマネージャは、最後の手段として使用されます。ユーザーがあなたのプロセスをCtrl + Alt + Delして死に至らない場合は、もう一度チャンスを得ることはありません。
「プロセス全体が停止している場合にクリーンアップを実行するとどのくらい安全ですか」というコメントを挿入してください。 –
これを確認してください:http://stackoverflow.com/questions/838261/handling-end-process-of-a-windows-app .netのバージョンは異なりますが、コンセプトはまだ保持されています。 – seth