2006年03月20日

COM クライアント実装の道程 for TaskScheduler その最終回

さて一連のシリーズもいよいよ最終回。最後は TaskScheduler クラスの使い方をつらつら書いていくことにしましょう。

まず、TaskScheduler インスタンスを作成します。このインスタンスは使い終わったら Dispose すべきです。初めに考えるのはタスクを設定する対象のコンピュータですが、ローカルのなら初期状態のままで構いません。リモートのは多分権限とか色々問題が発生すると思います。

TaskScheduler が行えるのは、タスクアイテムの取得(GetTask)・削除(DeleteTask)・作成(CreateTask)と現在スケジューラに登録されているタスクアイテムの名前の一覧取得(GetTaskNames)しかありません。なお、タスクアイテムは実際にはそれぞれ拡張子 job であるファイルで保存されますが、使用する名前は .job の有無はどちらでも構わないようで、"hoge.job" と "hoge" は同一視されるようです。

TaskScheduler.CreateTask または TaskScheduler.GetTask でタスクアイテムを表す Task インスタンスを取得したら、あとはこれに対してタスクアイテムに関する情報の取得・設定を行います。情報の設定を行った場合、Save メソッドを呼び出さない限り実際にファイルには反映されず、Save を呼ばずに終了した場合その変更は無視されます。

Task クラスの中心的なメンバは、ApplicationPath プロパティと SetAccount メソッド、そして CreateTrigger メソッドの三つです。新しく作ったタスクアイテムは、少なくともこの三つを設定しない限り動くことはありません(もっとも Windows 9x 系なら SetAccount は不要だと思います)。

ApplicationPath プロパティはその名の通り、時間ごとに起動するアプリケーションのパスを指定します。実行ファイル以外にも、関連づけされているファイル(例えば mp3 ファイルとか)ならなんでも指定できます。また Parameters プロパティで起動時の引数を、WorkingDirectory プロパティで起動ディレクトリを指定できます(これらは関連づけで起動する場合は意味がないような気もしますが)。Priority プロパティで実行するプロセスの優先度も指定できます。

SetAccount メソッドは、タスクが実行されるアカウントを、アカウント名とパスワードを指定して設定します。アカウント名に空文字列を使った場合ローカルアカウントで実行されるそうです。また、パスワードを指定しないでアカウントを設定することもできます。ただし、Flags プロパティに TaskFlags.RunOnlyIfLoggedOn を設定しておかなければなりません。この場合、そのアカウントのユーザがログオンしている場合のみタスクが有効になります。Flags プロパティにはこの他各種設定がそろっていますが、Windows 95 のみと書かれているものに関しては無効のはずです。電源管理についてもWindows 95 のみと書かれている(タスクのプロパティダイアログにも出てくるのに)ので微妙ですが。もし存在しないアカウント名を指定した場合、または誤ったパスワードを指定した場合、Task.Save を呼び出すときに例外が発生します。

CreateTrigger メソッドは、実際の起動条件(トリガ)である TaskTrigger を指定してそのトリガを作成します。ここで渡す TaskTrigger は事前に作成済みでなければならず、CreateTrigger を呼び出した後に TaskTrigger を変更しても意味はありません。また、ITaskTrigger インターフェイスを外に見せないという方針のために、既存のトリガを置き換えることが多少面倒になっています。Task クラスは ReplaceTrigger メソッドを用意しています。このメソッドは指定したインデックスにあるトリガを置き換え、代わりにその元々存在していた同じインデックスの TaskTrigger を返します。GetTrigger / CreateTrigger から ReplaceTrigger までの間に DeleteTrigger でインデックスが変更される可能性がある場合、Task クラスの使用者は返ってきたトリガを見て、正しくインデックスが指定されたかを確認できます。

次に Task.CreateTrigger などに使用する TaskTrigger クラスについて解説します。

TaskTrigger は、通常 DateTime を与えてインスタンスを作成します。この与える DateTime はインスタンス作成後に StartDateTime プロパティを設定するのと等価で、年月日の部分がこのトリガが有効になる開始日を、時分の部分がタスクが起動する時間を表します。

トリガの継続時間を設定するには、TaskDuration プロパティと WatchInterval プロパティを使用します。TaskDuration と WatchInterval が両方設定されている場合、TaskDuration で指定された時間の間、WatchInterval に指定した時間間隔でタスクスケジューラがプログラムが起動しているかどうかを確認し、起動していない場合は改めて起動させ、プログラムが TaskDuration まで継続するようにします。このとき、TaskDuration は必ず WatchInterval よりも長くないといけません。そうでない場合、CreateTrigger または ReplaceTrigger を呼び出すときに例外が発生します。また、TaskTrigger.Flags に TriggerFlags.KillAtDurationEnd を指定した場合、TaskDuration で指定した時間後タスクスケジューラはプログラムを終了させます。

TriggerFlags には他にトリガの有効期限を設ける HasEndDate と、トリガを無効にする Disabled があります。このうち HasEndDate は TaskTrigger.EndDate プロパティの設定を有効にします。このフラグをたてていない場合 EndDate プロパティは無効です。

以上のプロパティの他、TaskTrigger にはトリガの発動間隔を設定するための SetAs をプリフィクスにするいくつかの重要なメソッドがあります。例えば数日おきに起動させるトリガとするための SetAsDaily メソッドや、ログオン時に起動させるトリガとする SetAsAtLogon などです。これらのうち周期的に実行するトリガとするもの、すなわち SetAsDaily、SetAsWeekly、SetAsMonthlyDate、SetAsMonthlyDayOfWeek はそれぞれ設定に必要な引数を取りますが、直接値を指定するほか、それらの値を含んでいる構造体を渡すこともできます。

現在のトリガの情報は、取得専用の TriggerType プロパティでトリガのタイプを取得できるほか、一定間隔で起動させるタイプのトリガについてはそれらの詳細情報を取得するために GetAs プリフィクスの各種メソッドが用意されています。これらは、TaskTrigger の TriggerType プロパティがその取得しようとする詳細情報のタイプと一致していなければ例外を投げるので注意してください。

以上でおおよその解説は終了です。ここに書いていないことについては XML ドキュメントを参照してください。

ファイルが割と増えたため、今回は VS プロジェクトとして公開してみます。VS2002 用のプロジェクトVS2005 用のプロジェクト です。ちなみにソースファイルは全く同じです(笑)。もともと #if で分けるように書いているので。VS を使わずコンパイラでコンパイルするのもそう難しくはなく、含まれてる .cs ファイルをまとめてコンパイラに渡すだけです。バージョンに応じて V10、V11、V20 のいずれかのシンボルを /d オプションで付ける必要がありますが。

改造指針として、Unmanaged フォルダに入っているファイル群を別の DLL としてプロジェクトを分けることが考えられます。全く別の機能ですし。また ITaskTrigger 周りはもっと良い実装があるかも知れません。

と言うわけで全十回ぐらいに渡ってお送りした COM インターフェイスのラップクラスサンプル、シリーズ終了と相成りました。正直需要はほとんど無かったでしょうが。どうも途中から私自身迷走感が感じられてきて困りました。読者ターゲット不明というか。こんなの読むような人にとって大半は釈迦に説法と言うか。

次回からはまた細々と更新をやっていきたいと思います。

posted by Hongliang at 22:11| Comment(3) | TrackBack(0) | .NET | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
TaskScheduler クラスを使わせていただきました。
ありがとうございました。
Posted by ktk2 at 2007年08月25日 11:27
ご利用ありがとうございます。
たぶん今見返すと修正を入れたくなる箇所が出てくるんでしょうが(w; 世のライブラリ製作者って凄いなぁ。
そういえば Vista でタスクスケジューラ開こうとすると UAC のダイアログが出ますが、ここで作成した TaskScheduler クラス使った場合どうなるんですかね?
Posted by Hongliang at 2007年09月01日 02:29
http://ameblo.jp/qsoft/entry-10616368188.html のソフトで使わさせていただきました。スタンバイから復帰するのフラグを立てるだけで COM か〜なんて落ち込んでいるときに発見しました。非常に助かりました。
Posted by Q at 2010年08月17日 17:41
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。

ただし、公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。

あ、こんなのに使ったってコメントを頂ければ嬉しいです。

×

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