Vistaの場合は、管理ツールの下にアイコンが移動し、より細かい設定が出来るようになっています。
アンチウィルスソフト等が、アップデートを定期的に行うために、更新チェック用アプリの起動を登録している事が多いですが、OSのタスク機能はCOMで実装されているため、インタフェースを取得すれば、プログラム内からも操作を行う事が可能です。
今回はVC++で作成したプログラムでタスク登録を行ってみましょう。
まず、インタフェース等が定義された"mstask.h"ファイルをソースにインクルードし、ビルドを行う時に"mstask.lib"とリンクするように設定を行います。
基本的な流れは以下の通り。
- CoCreateInstance()で、CTaskSchedulerオブジェクトのインスタンスを生成して、ITaskSchedulerのインタフェースを取得。
- ITaskScheduler::NewWorkItem()で新しいタスクを作成。
- ITaskScheduler::SetApplicationName()で起動するアプリケーションのパスを設定。
- ITaskScheduler::SetAccountInformation()で、アプリケーションを実行するアカウント情報を設定。
- ITaskScheduler::CreateTrigger()で、起動トリガーを作成してITaskTriggerのインタフェースを取得。
- ITaskTrigger::SetTrigger()で起動条件を設定。
- ITaskTrigger::QueryInterface()で、IPersistFileインタフェースを取得。
- IPersistFile::Save()で、作成したタスクオブジェクトを保存。
VC2005用のサンプルはこちら。
サンプルをビルドして実行すると、約1分後にノートパッドを1回だけ起動するタスクがOSに登録されます。タスク終了後に自らを削除するため、ITaskScheduler::SetFlags()で、TASK_FLAG_DELETE_WHEN_DONEフラグも指定しました。
注意しないといけないのは、「4.」でタスクを実行するアカウントとパスワードを指定しないと、時間になってもアプリケーションの起動に失敗してしまいます。
何も指定しなかった場合、ログイン中のユーザーアカウントでタスクが登録されますが、ログインパスワードが設定されていない場合でもタスクが起動出来ないので、タスク登録用のアカウントを用意して使う等の対策が必要になってきます。
ちなみに、あるプロジェクトでタスク機能を使って定期的に処理を実行させる方法を検討した事があったのですが、OSが起動していない時や、システム時刻を前に進めた時に、その間のタスクが実行されずに残ってしまう問題等があるため諦めた事がありました。
分単位では割と正確にタスクを実行してくれますが、重要な処理や、秒単位で管理が必要な処理を実行するために利用するのは、避けた方が無難のようですね。