ITaskScheduler
COM公式ドキュメント
タスクをスケジュールするためのメソッドを提供します。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
SetTargetComputer メソッドは、ITaskScheduler インターフェイスが操作対象とするコンピューターを選択し、リモートでのタスク管理と列挙を可能にします。
| pwszComputer | LPWSTR | in | 現在の ITaskScheduler インターフェイスのインスタンスの対象コンピューター名を指定する、null 終端のワイド文字列へのポインター。対象コンピューター名は UNC (Universal Naming Convention) 形式で指定します。ローカルコンピューターを指定するには、この値を NULL にするか、ローカルコンピューターの UNC 名を指定します。 注意 リモートコンピューター名を指定する場合は、コンピューター名の前に 2 つのバックスラッシュ (\\) 文字を付けます。たとえば、"ComputerName" ではなく "\\ComputerName" のように指定します。
|
戻り値
SetTargetComputer メソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 対象コンピューターに Task Scheduler サービスがインストールされていません。 | |
|
ユーザーにリモートコンピューターへのアクセス権がありません。 |
| pwszComputer パラメーターが無効です。 | |
| メモリの割り当てに失敗しました。 |
解説(Remarks)
Windows Server 2003 または Windows XP のコンピューターが Windows Vista のコンピューター上のタスクを作成、監視、または制御するには、Windows Vista のコンピューターで以下の操作を完了しておく必要があり、また ITaskScheduler::SetTargetComputer メソッドを呼び出すユーザーは、リモートの Windows Vista コンピューター上の Administrators グループのメンバーである必要があります。
Windows ファイアウォールで「ファイルとプリンターの共有」の例外を有効にする
- [スタート]をクリックし、[コントロール パネル]をクリックします。
- コントロール パネルで クラシック表示 をクリックし、Windows ファイアウォール アイコンをダブルクリックします。
- Windows ファイアウォールのウィンドウで [例外] タブをクリックし、[ファイルとプリンターの共有]の例外 のチェック ボックスをオンにします。
「Remote Registry」サービスを有効にする
- コマンド プロンプト ウィンドウを開き、次のコマンドを入力します: net start "Remote Registry"
GetTargetComputer メソッドは、現在 ITaskScheduler が対象としているコンピューターの名前を返します。
| ppwszComputer | LPWSTR* | out | 現在のタスクの対象コンピューター名を格納する、null 終端文字列へのポインター。この文字列は GetTargetComputer を呼び出したアプリケーションによって割り当てられ、CoTaskMemFree を使用して解放する必要があります。 |
戻り値
GetTargetComputer メソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 操作は成功しました。 | |
| 引数が無効です。 | |
| 使用可能なメモリが不足しています。 |
Enum メソッドは、現在のタスク フォルダー内のタスクを列挙する OLE 列挙子オブジェクトへのポインターを取得します。
| ppEnumWorkItems | IEnumWorkItems** | out | IEnumWorkItems インターフェイスへのポインターへのポインター。このインターフェイスは、現在のタスクの列挙コンテキストを保持します。 |
戻り値
Enum メソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 操作は成功しました。 | |
| 引数が無効です。 | |
| 使用可能なメモリが不足しています。 |
解説(Remarks)
既定では、現在のフォルダーはローカルコンピューター上に存在します。リモートコンピューターの場合は、 ITaskScheduler::GetTargetComputer を呼び出し、この呼び出しで返される名前を使用します。対象コンピューターを変更するには、 ITaskScheduler::SetTargetComputer を呼び出します。
| 次の完全な例 | 参照先 |
|---|---|
| Enum を使用してローカルコンピューター上のタスク名を取得する例 | Enumerating Tasks Example |
Activate メソッドは、指定した作業項目に対するアクティブなインターフェイスを返します。
| pwszName | LPWSTR | in | アクティブ化する作業項目の名前を指定する、null 終端文字列。 |
| riid | GUID* | in | 要求するインターフェイスを識別する識別子。現時点でサポートされている唯一のインターフェイスである ITask は、識別子 IID_ITask を持ちます。 |
| ppUnk | IUnknown** | out | 要求されたインターフェイスのアドレスを受け取るインターフェイス ポインターへのポインター。 |
戻り値
このメソッドが成功すると、S_OK が返されます。
メソッドが失敗した場合は、次のいずれかのエラー コードが返されることがあります。
| 戻り値 | 説明 |
|---|---|
|
タスクが存在しません。 |
| pwszName パラメーターが無効です。 | |
| メモリの割り当てに失敗しました。 | |
| タスク オブジェクトのバージョンがサポートされていないか、無効です。 |
Delete メソッドは、タスクを削除します。
| pwszName | LPWSTR | in | 削除するタスクの名前を指定する、null 終端文字列。 |
戻り値
Delete メソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 操作は成功しました。 | |
| 引数が無効です。 | |
| 使用可能なメモリが不足しています。 |
NewWorkItem メソッドは、新しい作業項目を作成し、その作業項目のための領域を割り当てて、そのアドレスを取得します。
| pwszTaskName | LPWSTR | in | 新しい作業項目の名前を指定する、null 終端文字列。この名前は Windows NT のファイル命名規則に従う必要がありますが、タスク フォルダー オブジェクト内での入れ子は許可されていないため、バックスラッシュを含めることはできません。 |
| rclsid | GUID* | in | 作成する作業項目のクラス識別子。現時点でサポートされている唯一のクラスであるタスク クラスは、識別子 CLSID_Ctask を持ちます。 |
| riid | GUID* | in | 要求するインターフェイスの参照識別子。現時点でサポートされている唯一のインターフェイスである ITask は、識別子 IID_ITask を持ちます。 |
| ppUnk | IUnknown** | out | 要求されたインターフェイスを受け取るインターフェイス ポインターへのポインター。作業項目をディスクに保存する方法については、「解説」を参照してください。 |
戻り値
NewWorkItem メソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 操作は成功しました。 | |
| 指定した名前の作業項目が既に存在します。実際の戻り値は HRESULT_FROM_WIN32 (ERROR_FILE_EXISTS) です。 | |
| 1 つ以上の引数が無効です。 | |
| 操作を完了するために使用可能なメモリが不足しています。 | |
| 呼び出し元にこの操作を実行する権限がありません。詳細については、「Scheduled Work Items」を参照してください。 |
解説(Remarks)
このメソッドは、新しい作業項目を作成する際にメモリの割り当てを自動的に処理します。
作業項目をディスクに保存するには、 IPersistFile::Save を呼び出します。この COM インターフェイスは、すべての作業項目インターフェイスでサポートされています (現時点では ITask が唯一サポートされている作業項目インターフェイスです)。
Task Scheduler は、作業項目を追加するために 2 つのメソッド、 NewWorkItem と AddWorkItem を提供します。これらのメソッドには、それぞれ固有の利点があります。 AddWorkItem は名前の衝突を防ぎますが、呼び出しごとに 2 回のディスク書き込み操作を必要とします。1 回目の書き込み操作は、 AddWorkItem の呼び出しによってディスク上に空の作業項目オブジェクトが作成されるときに実行され、その後、IPersistFile::Save が呼び出されるときにもう 1 回の書き込み操作が実行されます。
タスクは、AddWorkItem または NewWorkItem を呼び出して作成できます。AddWorkItem を使用する場合は、Task オブジェクト (ITask インターフェイスをサポートします) のインスタンスを作成し、指定した名前でタスクを追加する責任は呼び出し元にあります。
NewWorkItem は名前の衝突を防ぎませんが、IPersistFile::Save が呼び出されるときに必要となるディスク書き込み操作は 1 回だけです。 NewWorkItem はディスク書き込み操作の面ではより効率的ですが、IPersistFile::Save が呼び出される前に別のアプリケーションが同じ名前の作業項目を作成してしまうリスクがあります。
| 次の完全な例 | 参照先 |
|---|---|
| 新しいタスクの作成 | Creating a Task Using NewWorkItem Example |
AddWorkItem メソッドは、タスクのスケジュールにタスクを追加します。
| pwszTaskName | LPWSTR | in | 追加するタスクの名前を指定する、null 終端文字列。タスク名は Windows NT のファイル命名規則に従う必要がありますが、タスク フォルダー オブジェクト内での入れ子は許可されていないため、バックスラッシュを含めることはできません。 |
| pWorkItem | IScheduledWorkItem* | in | スケジュールに追加するタスクへのポインター。 |
戻り値
AddWorkItem メソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 操作は成功しました。 | |
| 指定した名前のタスクが既に存在します。実際の戻り値は HRESULT_FROM_WIN32(ERROR_FILE_EXISTS) です。 | |
| 1 つ以上の引数が無効です。 | |
| 操作を完了するために使用可能なメモリが不足しています。 |
解説(Remarks)
Task Scheduler は、作業項目を追加するために 2 つのメソッド、 NewWorkItem と AddWorkItem を提供します。これらのメソッドには、それぞれ固有の利点があります。 AddWorkItem は名前の衝突を防ぎますが、呼び出しごとに 2 回のディスク書き込み操作を必要とします。1 回目の書き込み操作は、 AddWorkItem の呼び出しによってディスク上に空の作業項目オブジェクトが作成されるときに実行され、その後、IPersistFile::Save が呼び出されるときにもう 1 回の書き込み操作が実行されます。
NewWorkItem は名前の衝突を防ぎませんが、IPersistFile::Save が呼び出されるときに必要となるディスク書き込み操作は 1 回だけです。 NewWorkItem はディスク書き込み操作の面ではより効率的ですが、IPersistFile::Save が呼び出される前に別のアプリケーションが同じ名前の作業項目を作成してしまうリスクがあります。
IsOfType メソッドは、オブジェクトの型を調べて、特定のインターフェイスをサポートしているかどうかを確認します。
| pwszName | LPWSTR | in | 調べるオブジェクトの名前を格納する、null 終端文字列。 |
| riid | GUID* | in | 照合するインターフェイスの参照識別子。 |
戻り値
IsOfType メソッドは、pwszName で指定されたオブジェクトが riid で指定されたインターフェイスをサポートしている場合に S_OK を返します。それ以外の場合は S_FALSE が返されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ITaskScheduler "{148BD527-A2AB-11CE-B11F-00AA00530503}" #usecom global ITaskScheduler IID_ITaskScheduler "{0F87369F-A4E5-4CFC-BD3E-73E6154572DD}" #comfunc global ITaskScheduler_SetTargetComputer 3 wstr #comfunc global ITaskScheduler_GetTargetComputer 4 var #comfunc global ITaskScheduler_Enum 5 sptr #comfunc global ITaskScheduler_Activate 6 wstr,var,sptr #comfunc global ITaskScheduler_Delete 7 wstr #comfunc global ITaskScheduler_NewWorkItem 8 wstr,var,var,sptr #comfunc global ITaskScheduler_AddWorkItem 9 wstr,sptr #comfunc global ITaskScheduler_IsOfType 10 wstr,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ITaskScheduler "{148BD527-A2AB-11CE-B11F-00AA00530503}" #usecom global ITaskScheduler IID_ITaskScheduler "{0F87369F-A4E5-4CFC-BD3E-73E6154572DD}" #comfunc global ITaskScheduler_SetTargetComputer 3 wstr #comfunc global ITaskScheduler_GetTargetComputer 4 sptr #comfunc global ITaskScheduler_Enum 5 sptr #comfunc global ITaskScheduler_Activate 6 wstr,sptr,sptr #comfunc global ITaskScheduler_Delete 7 wstr #comfunc global ITaskScheduler_NewWorkItem 8 wstr,sptr,sptr,sptr #comfunc global ITaskScheduler_AddWorkItem 9 wstr,sptr #comfunc global ITaskScheduler_IsOfType 10 wstr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。