IResourceManager
COM公式ドキュメント
IResourceManager インターフェイスは、システムリソースの競合を解決します。このインターフェイスはフィルターグラフマネージャーによって公開されます。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Register メソッドは、名前付きリソースを 1 つリソースマネージャーに登録します。
| pName | LPWSTR | in | 名前付きリソース。 |
| cResource | INT | in | リソースの数。 |
| plToken | INT* | out | 以降の呼び出しで使用する、リソースを識別する返却トークンへのポインター。 |
戻り値
実装に依存する HRESULT 値を返します。HRESULT は次の標準的な定数のいずれか、またはここに記載されていない他の値になります。
| 戻り値コード | 説明 |
|---|---|
| 失敗。 | |
| NULL ポインター引数。 | |
| 無効な引数。 | |
| メソッドはサポートされていません。 | |
|
成功。 |
解説(Remarks)
このメソッドは、複数のリソースを含みうる名前付きリソースを登録し、そのリソースを要求する際に使用するトークンを返します。リソースが既に登録済みであってもエラーにはなりません。cResource パラメーターの数が既に登録されている数より少ない場合、リソースは新しい数まで解放されます。リソースの登録を解除するには、cResource に 0 を渡します。
RegisterGroup メソッドは、名前付きリソースグループをリソースマネージャーに登録します。
| pName | LPWSTR | in | 名前付きリソースグループ。 |
| cResource | INT | in | グループ内のリソースの数。 |
| palTokens | INT* | in | グループ内のリソースの配列へのポインター。 |
| plToken | INT* | out | 返却されるグループリソース識別子へのポインター。 |
戻り値
実装に依存する HRESULT 値を返します。HRESULT は次の標準的な定数のいずれか、またはここに記載されていない他の値になります。
| 戻り値コード | 説明 |
|---|---|
| 失敗。 | |
| NULL ポインター引数。 | |
| 無効な引数。 | |
| メソッドはサポートされていません。 | |
|
成功。 |
RequestResource メソッドは、登録済みの指定リソースの使用を要求します。
| idResource | INT | in | リソースの登録時に取得したリソーストークン。 |
| pFocusObject | IUnknown* | in | 要求に関連付けられたフォーカスオブジェクトの IUnknown インターフェイスへのポインター(通常はフィルターの IUnknown インターフェイス)。 |
| pConsumer | IResourceConsumer* | in | リソースを要求しているオブジェクトの IResourceConsumer インターフェイスへのポインター。 |
戻り値
HRESULT 値を返します。要求したリソースが返される場合は S_OK を、リソースが利用できない場合は S_FALSE を返します。後者の場合、リソースが利用可能になったときにリソースマネージャーが要求元のオブジェクトをコールバックします。それ以外の戻り値はエラーです。
解説(Remarks)
リソースに対する要求が複数存在する場合、リソースマネージャーは各要求とともに渡されたフォーカスオブジェクトを、直近の IResourceManager::SetFocus メソッドで渡されたフォーカスオブジェクトと比較して優先順位を決定します。
要求は次の優先順位で処理されます。
- 直近の SetFocus メソッドとまったく同じフォーカスオブジェクトで行われた要求。
- フォーカスオブジェクトが共通のソースフィルターを共有し、そのフォーカスオブジェクトが共通のフィルターグラフを共有する要求。
- フォーカスと同じプロセス内の要求。
フィルターは、pFocusObject パラメーターにフィルターの IUnknown インターフェイスを渡す必要があります。フィルターグラフマネージャーはフィルターをフィルターグラフと突き合わせ、フォーカスオブジェクトを確認する際に共通のソースフィルターまでフィルターをたどろうとします。
フォーカスオブジェクトは、要求の存続期間全体にわたって有効でなければなりません。すなわち、IResourceManager::CancelRequest メソッドが呼び出されるか、bStillWant パラメーターを FALSE に設定して IResourceManager::NotifyRelease メソッドが呼び出されるまで有効である必要があります。
NotifyAcquire メソッドは、リソースを取得しようとする試みが完了したことをリソースマネージャーに通知します。
| idResource | INT | in | 登録済みリソースのトークン。 |
| pConsumer | IResourceConsumer* | in | リソースを要求しているオブジェクトの IResourceConsumer インターフェイスへのポインター。 |
| hr | HRESULT | in | 取得の成否を示す値。リソースが取得できた場合は S_OK、取得できなかった場合はエラー値。 |
戻り値
実装に依存する HRESULT 値を返します。HRESULT は次の標準的な定数のいずれか、またはここに記載されていない他の値になります。
| 戻り値コード | 説明 |
|---|---|
| 失敗。 | |
| NULL ポインター引数。 | |
| 無効な引数。 | |
| メソッドはサポートされていません。 | |
|
成功。 |
解説(Remarks)
IResourceConsumer::AcquireResource メソッドが S_FALSE 値を返し、取得が非同期(すなわちコールバック機構によって処理される)であることを示した後に、このメソッドを使用します。hr パラメーターが S_OK の場合、リソースマネージャーはリソースが現在呼び出し元によって保持されているものとみなします。hr パラメーターが S_OK 以外の場合、リソースマネージャーはリソースの取得の試みが失敗したものとみなし、リソースを他の要求に再割り当てします。
NotifyRelease メソッドは、IResourceConsumer がリソースを解放したことをリソースマネージャーに通知します。
| idResource | INT | in | リソーストークン。 |
| pConsumer | IResourceConsumer* | in | リソースを解放するオブジェクトへのポインター。 |
| bStillWant | BOOL | in | リソースが引き続き必要かどうかを指定するフラグ。次に利用可能になったときにリソースをまだ必要とする場合は TRUE を、リソースが不要になった場合は FALSE を設定します。 |
戻り値
実装に依存する HRESULT 値を返します。HRESULT は次の標準的な定数のいずれか、またはここに記載されていない他の値になります。
| 戻り値コード | 説明 |
|---|---|
| 失敗。 | |
| NULL ポインター引数。 | |
| 無効な引数。 | |
| メソッドはサポートされていません。 | |
|
成功。 |
解説(Remarks)
このメソッドは、IResourceConsumer::ReleaseResource メソッドへの応答として、またはリソースの使用を終えたときに使用します。
CancelRequest メソッドは、リソースの要求をキャンセルします。
| idResource | INT | in | 保留中の要求のリソース識別子。 |
| pConsumer | IResourceConsumer* | in | 要求を行った IResourceConsumer インターフェイスへのポインター。 |
戻り値
実装に依存する HRESULT 値を返します。HRESULT は次の標準的な定数のいずれか、またはここに記載されていない他の値になります。
| 戻り値コード | 説明 |
|---|---|
| 失敗。 | |
| NULL ポインター引数。 | |
| 無効な引数。 | |
| メソッドはサポートされていません。 | |
|
成功。 |
解説(Remarks)
このメソッドは、リソースを要求した IResourceConsumer オブジェクトがそのリソースを受け取っておらず、かつ不要になった場合に呼び出す必要があります。既にリソースを受け取っている場合は、IResourceManager::NotifyRelease メソッドを使用してください。
SetFocus メソッドは、指定したオブジェクトにユーザーのフォーカスが与えられたことをリソースマネージャーに通知します。
| pFocusObject | IUnknown* | in | ユーザーのフォーカスが与えられたオブジェクトへのポインター。 |
戻り値
実装に依存する HRESULT 値を返します。HRESULT は次の標準的な定数のいずれか、またはここに記載されていない他の値になります。
| 戻り値コード | 説明 |
|---|---|
| 失敗。 | |
| NULL ポインター引数。 | |
| 無効な引数。 | |
| メソッドはサポートされていません。 | |
|
成功。 |
解説(Remarks)
DirectShow では、ユーザーのフォーカスが与えられるオブジェクトは通常、そのウィンドウがフォーカスを受け取ったビデオレンダラーです。リソースマネージャーは、リソースの要求に対して次の順序で優先順位を与えます。
- pFocusObject パラメーターで指定されたフォーカスオブジェクトで行われた要求。
- フォーカスオブジェクトが共通のソースフィルターを共有する要求。
- フォーカスオブジェクトが共通のフィルターグラフを共有する要求。
- フォーカスと同じプロセス内の要求。
SetFocus が呼び出されることを保証できる場合を除き、フォーカスオブジェクトの IUnknown インターフェイスが無効になる前に ReleaseFocus を使用する必要があります。フォーカスオブジェクトに対する参照カウントは保持されません。
リソースマネージャーは、このポインターが置き換えられるかキャンセルされるまで保持し、リソースの競合を解決するために使用します。少なくとも IBaseFilter インターフェイスに対して QueryInterface を使用し、見つかった場合はそのインターフェイスのメソッドを使用します。オーディオレンダラーが 2 つある場合にどちらを使用するかを決定するために(フォーカスオブジェクトと共通のソースフィルターを持つ方を選択します)、また 2 つのオブジェクトが同じフィルターグラフ内にあるかどうかを判断するために、IBaseFilter のメソッドを呼び出します。
ReleaseFocus メソッドは、現在のフォーカスオブジェクトがこのメソッドで指定されたものと一致する場合に、リソースマネージャー内のフォーカスオブジェクトを NULL に設定します。
| pFocusObject | IUnknown* | in | フォーカスオブジェクトへのポインター。 |
戻り値
実装に依存する HRESULT 値を返します。HRESULT は次の標準的な定数のいずれか、またはここに記載されていない他の値になります。
| 戻り値コード | 説明 |
|---|---|
| 失敗。 | |
| NULL ポインター引数。 | |
| 無効な引数。 | |
| メソッドはサポートされていません。 | |
|
成功。 |
解説(Remarks)
フォーカスオブジェクトが破棄されようとしているときに、フォーカスがまだ参照されていない状態にするためにこのメソッドを使用します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IResourceManager "{56A868AC-0AD4-11CE-B03A-0020AF0BA770}" #usecom global IResourceManager IID_IResourceManager "{}" #comfunc global IResourceManager_Register 3 wstr,int,var #comfunc global IResourceManager_RegisterGroup 4 wstr,int,var,var #comfunc global IResourceManager_RequestResource 5 int,sptr,sptr #comfunc global IResourceManager_NotifyAcquire 6 int,sptr,int #comfunc global IResourceManager_NotifyRelease 7 int,sptr,int #comfunc global IResourceManager_CancelRequest 8 int,sptr #comfunc global IResourceManager_SetFocus 9 sptr #comfunc global IResourceManager_ReleaseFocus 10 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IResourceManager "{56A868AC-0AD4-11CE-B03A-0020AF0BA770}" #usecom global IResourceManager IID_IResourceManager "{}" #comfunc global IResourceManager_Register 3 wstr,int,sptr #comfunc global IResourceManager_RegisterGroup 4 wstr,int,sptr,sptr #comfunc global IResourceManager_RequestResource 5 int,sptr,sptr #comfunc global IResourceManager_NotifyAcquire 6 int,sptr,int #comfunc global IResourceManager_NotifyRelease 7 int,sptr,int #comfunc global IResourceManager_CancelRequest 8 int,sptr #comfunc global IResourceManager_SetFocus 9 sptr #comfunc global IResourceManager_ReleaseFocus 10 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。