2005年07月31日

事前に登録したプログラムを順番に終了させる方法

空の雲は厚く、郊外は緑のジャングル、
時おりスコールと雷鳴が都会慣れした我々を脅かす。
日本の梅雨と変わらない気候が重くのしかかる。
そこは赤道にほど近い東南アジアのとある場所...

先進国で生活されるほとんどの皆さんは、
水道、ガス、電気などのライフラインは
整備されいることが当たり前と思われるでしょう。
私が出張で滞在した東南アジアのライフラインは、
日本の水準では考えられないものでした。

雷が鳴るたびに電源の供給が停止し、
機関系システムが、
たびたびUPS電源のお世話になるのです。
停電も日本のように瞬停ではなく、
復旧しないこともしばしばありました。
(今では改善され良くなったと聞きますが...)

少し前置きが長くなりました。
今回は停電発生時にUPSの
自動シャットダウン機能などから実行し、
機関系システムの関連プロセスを一斉に終了させるのに便利な
WindowsのサンプルプログラムをDelphiで紹介しましょう。
OSシャットダウン前に、関連プロセスを順番に終了し、
大切なデータを保護することが目的です。

通常の行儀良いWindowsアプリケーションは、
「WM_QUIT」メッセージを受信すると終了処理を行います。
中にはははみ出し者がいるもので、
これに従わなアプリケーションもあることでしょう。

本プログラムはINIファイルに記述されたプログラム名を、
EnumWindows」、「EnumProcesses」APIの
実行結果から情報を検索し終了させます。
終了手順は、該当プロセスへ「WM_QUIT」を送信し、
相手が自主的に行儀良く終了するのを待ちます。
一定時間内に相手が終了しない場合、
TerminateProcess」を発行し強制的に終了させます。
一連の処理を実行後、本プログラムは自動で終了し、
起動から終了までの処理をログファイルに書き込みます。

処理内容
説明
@プロセスの取得
「EnumWindows」、「EnumProcesses」などのAPIを利用し、現在稼動中のプロセス情報を取得する。基本的にウィンドウを持つプロセスの情報を取得する。
AINIファイルの読込
INIファイルを読込み、終了させたいプロセスの実行モジュール名を取得する。
Bプロセスの終了
Aで読込んだ実行モジュール名を@のプロセス情報から取得し終了処理を行う。はじめ該当プロセスへ「WM_QUIT」を送信するが、一定時間以上応答が無い場合、「TerminateProcess」APIを発行し該当プロセスを強制終了する。

全ソースは【続きを読む】をクリック!

【画面イメージ】

Terminator.gif

関連書籍


Copyright guy@かしらもんじ でぇ〜

続きを読む
posted by guy at 06:39 | 運用管理編

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。