kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Task Scheduler 2.0と1.0のAPIレベルの差

昨日ざっくりとタスク機能の歴史を見たので、今日はもうちょっと細かいところを。
Task Scheduler API 2.0の変更で一番気になったのが文字列と日付の扱いです。1.0ではTASK_TRIGGER構造体を作って、ITaskTrigger::SetTriggerへ渡すだけでした。DST(Daylight Saving Time=Summer Time)も考慮されていません。これだとDSTがあるところだとちょっと厳しかったのではないかなと思います。
2.0ではDATE(実態はdoubleのtypedef)のポインタを取るようになっています。このDATEからSYSTEMTIME構造体への変換はVariantTimeToSystemTimeを使います。NT4.0/Windows 95時代の話ですが、以下のKBでミリ秒を無視するとあります。が、タスクでの変換ならば秒単位でも問題ないでしょう。
PRB: VariantTimeToSystemTime と SystemTimeToVariantTime の機能システムの時刻のミリ秒の値を無視します。
XML SchemaのDateTimeフォーマットはXMLに書きだすときだけ気を付ければいいようです。API経由ではDATE型(typedef double)なので、一安心。
次に文字ですが、1.0ではWCHARを要求するインターフェースでした。たとえば、ITaskScheduler::Activate(タスクを確定するときに呼び出します)は、LPCWSTR、つまり必ずワイド文字列(=Unicode)です。プログラムをANSIで作っていたとしてもA2Wマクロや、MultiByteToWideChar…ほかにもいくつかある変換用の関数でWCHARに変換しましょう。
これが2.0ではなぜかBSTRになりました。たとえば、登録済みタスク情報を取得するIRegisteredTask::NameプロパティではBSTRです。BSTRなんて全然使ってなかったので、変換とか調べる羽目になりました。ううっ、なんでBSTRなんだよぅ。
当然の補足事項ですが、この辺のInterfaceは全部Manager側でメモリを確保しているので、基本呼び出し側で解放してあげましょう。解放しないと痛い目を見るかもしれません。相手はサービスなんで、ずっと生き残っています。