IRunnableTask
COM公式ドキュメント
オブジェクトが公開することで、バックグラウンドスレッドで処理を実行できるようにするフリースレッドインターフェイスです。
解説(Remarks)
名前空間拡張がフリースレッドで、アイコン抽出などのタスクをスケジューラーに管理させたい場合は、IRunnableTask を実装します。実装が必須なのは Run メソッドと IsRunning メソッドのみです。Kill、Resume、Suspend を実装したくない場合は、単に E_NOTIMPL を返すようにしてください。
IRunnableTask をバックグラウンドスレッドでの画像抽出に使用する場合、すなわちオブジェクトが IExtractImage を公開している場合は、システムが IExtractImage::Extract を使用してタスクを管理するため、Run は不要です。この場合、その他のメソッド(Kill、Resume、Suspend)は省略可能ですが、実装されていればシステムによって使用されます。
このインターフェイスを直接呼び出すことはありません。IRunnableTask は、アプリケーションがこのインターフェイスを認識していることをシステムが確認した場合にのみ、オペレーティングシステムによって使用されます。
IRunnableTask は、上記の 5 つのメソッドに加えて IUnknown を実装します。
メソッド 5
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
タスクの開始を要求します。
戻り値
解説(Remarks)
このメソッドの戻り値は、タスクの実行が完了したか中断されたかを示すだけです。実装者が呼び出し元に伝える必要のあるその他のエラーは、コールバック関数などの別の手段を通じて提供する必要があります。
タスクの停止を要求します。
| bWait | BOOL | in | 現在は使用されていません。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドの実装は省略可能です。この機能をサポートしない場合は、単に E_NOTIMPL を返すだけのダミー実装を作成してください。
タスクの中断を要求します。
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合は標準的な COM 定義のエラーコードを返します。
解説(Remarks)
このメソッドの実装は省略可能です。この機能をサポートしない場合は、単に E_NOTIMPL を返すだけのダミー実装を作成してください。
タスクの再開を要求します。
戻り値
型: HRESULT
成功した場合は S_OK を、それ以外の場合は標準的な COM 定義のエラーコードを返します。
解説(Remarks)
このメソッドの実装は省略可能です。この機能をサポートしない場合は、単に E_NOTIMPL を返すだけのダミー実装を作成してください。
サムネイル抽出などのタスクの状態に関する情報を要求します。
戻り値
型: LONG
現在の実行状態を示す次の値のいずれかを返します。
| 戻り値のコード | 説明 |
|---|---|
| 抽出がまだ開始されていません。 | |
| タスクは実行中です。 | |
| タスクは中断されています。 | |
|
スレッドに対して IRunnableTask::Kill が呼び出されましたが、スレッドがまだ完全にシャットダウンしていません。 |
|
| タスクは完了しました。 |
解説(Remarks)
このメソッドは必ず実装する必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IRunnableTask "{85788D00-6807-11D0-B810-00C04FD706EC}"
#usecom global IRunnableTask IID_IRunnableTask "{}"
#comfunc global IRunnableTask_Run 3
#comfunc global IRunnableTask_Kill 4 int
#comfunc global IRunnableTask_Suspend 5
#comfunc global IRunnableTask_Resume 6
#comfunc global IRunnableTask_IsRunning 7
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。