IKsTopologyInfo
COM公式ドキュメント
IKsTopologyInfo インターフェースは、ストリームクラスドライバー内のノードを列挙します。KsProxy フィルターがこのインターフェースを公開します。アプリケーションはこのインターフェースを使用して、カーネルモードフィルターの内部トポロジを調べることができます。
解説(Remarks)
Windows Driver Model において、カーネルストリーミング (KS) フィルターは 1 つ以上のノードを含みます。各ノードは、ストリームに適用される処理タスクをカプセル化します。ノードには入力と出力があり、フィルター内の他のノード、またはフィルターのピンに接続されます。このようにして、ノードはフィルター内部の小さな「フィルターグラフ」のようになり、複数の可能なデータパスを含む場合があります。アプリケーションは IKsTopologyInfo インターフェースを使用して、ノードおよびノード接続に関する情報を取得できます。
一部のデバイスは、入力ノードを選択するための ISelector インターフェースもサポートしています。たとえば、ビデオキャプチャデバイスにカメラとテープ搬送機構がある場合、これらは 2 つのノードとして表現できます(前の図を参照)。
Windows SDK、または DirectX 9.0 SDK Update (Summer 2004) 以降から Vidcap.h をインクルードしてください。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
get_NumCategories メソッドは、このフィルターのカテゴリ数を返します。
| pdwNumCategories | DWORD* | out | カテゴリ数を受け取ります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 |
get_Category メソッドは、このストリームクラスドライバーのフィルターカテゴリの 1 つを返します。
| dwIndex | DWORD | in | 取得するカテゴリ GUID のインデックス。カテゴリ数を調べるには、IKsTopologyInfo::get_NumCategories メソッドを呼び出します。 |
| pCategory | GUID* | out | カテゴリを定義する GUID を受け取ります。Microsoft は、ヘッダーファイル Ks.h および Ksmedia.h で標準カテゴリを提供しています。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 |
get_NumConnections メソッドは、フィルター内のノード接続数を返します。
| pdwNumConnections | DWORD* | out | 接続数を受け取ります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
接続に関する情報を取得するには、IKsTopologyInfo::get_ConnectionInfo メソッドを呼び出します。
get_ConnectionInfo メソッドは、フィルター内の 1 つのノード接続に関する情報を返します。
| dwIndex | DWORD | in | 接続のインデックス。接続数を調べるには、IKsTopologyInfo::get_NumConnections メソッドを呼び出します。 |
| pConnectionInfo | KSTOPOLOGY_CONNECTION* | out | 呼び出し側が割り当てた KSTOPOLOGY_CONNECTION 構造体へのポインター。このメソッドは、この構造体に接続情報を格納します。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 |
get_NodeName メソッドは、ノードの名前を返します。
| dwNodeId | DWORD | in | ノードのインデックス。ノード数を調べるには、IKsTopologyInfo::get_NumNodes メソッドを呼び出します。 |
| pwchNodeName | LPWSTR | outoptional | 名前を受け取るワイド文字配列へのポインター。必要なバッファサイズを調べるには、このパラメーターを NULL に設定します。サイズは pdwNameLen パラメーターで返されます。 |
| dwBufSize | DWORD | in | pwchNodeName 配列のサイズ(バイト単位)。 |
| pdwNameLen | DWORD* | out | 名前を保持するために必要なバッファサイズ(バイト単位)を受け取ります。このパラメーターを NULL にすることはできません。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
バッファが十分な大きさではありません。 |
解説(Remarks)
名前のバッファサイズを調べるには、pwchNodeName パラメーターに NULL、dwBufSize パラメーターに 0 を指定して、このメソッドを一度呼び出します。メソッドは pdwNameLen にバッファサイズを返します。この場合のメソッドの戻り値は HRESULT_FROM_WIN32(ERROR_MORE_DATA) です。その後、配列を割り当てて、メソッドを再度呼び出します。
例
// pKsTopo は IKsTopologyInfo ポインターです。
// iNode はノードのインデックスです。
DWORD cbName = 0;
hr = pKsTopo->get_NodeName(iNode, NULL, 0, &cbName);
if (hr == HRESULT_FROM_WIN32(ERROR_MORE_DATA))
{
if (cbName > sizeof(WCHAR))
{
WCHAR *nodeName = new WCHAR[cbName / sizeof(WCHAR)];
if (nodeName == NULL)
{
hr = E_OUTOFMEMORY;
}
else
{
hr = pKsTopo->get_NodeName(iNode, nodeName, cbName, &cbName);
/* ... */
delete [] nodeName;
}
}
}
get_NumNodes メソッドは、フィルター内のノード数を返します。
| pdwNumNodes | DWORD* | out | ノード数を受け取ります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 |
get_NodeType メソッドは、指定されたノードのノードタイプを返します。
| dwNodeId | DWORD | in | ノードのインデックス。ノード数を調べるには、IKsTopologyInfo::get_NumNodes メソッドを呼び出します。 |
| pNodeType | GUID* | out | ノードタイプを定義する GUID を受け取ります。ノードタイプの一覧については、KS Node Types を参照してください。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 |
CreateNodeInstance メソッドは、フィルター内のノードを表す COM オブジェクトを作成します。
| dwNodeId | DWORD | in | 作成するノードのインデックス。ノード数を調べるには、IKsTopologyInfo::get_NumNodes メソッドを呼び出します。 |
| iid | GUID* | in | 返すインターフェースのインターフェース識別子 (IID)。 |
| ppvObject | void** | out | ノードオブジェクト上の要求されたインターフェースへのポインターを受け取ります。呼び出し側はインターフェースを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
ノードオブジェクトは IKsControl インターフェースを公開します。このインターフェースを使用して、ノードのプロパティセットを列挙し、アクセスできます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IKsTopologyInfo "{720D4AC0-7533-11D0-A5D6-28DB04C10000}" #usecom global IKsTopologyInfo IID_IKsTopologyInfo "{}" #comfunc global IKsTopologyInfo_get_NumCategories 3 var #comfunc global IKsTopologyInfo_get_Category 4 int,var #comfunc global IKsTopologyInfo_get_NumConnections 5 var #comfunc global IKsTopologyInfo_get_ConnectionInfo 6 int,var #comfunc global IKsTopologyInfo_get_NodeName 7 int,var,int,var #comfunc global IKsTopologyInfo_get_NumNodes 8 var #comfunc global IKsTopologyInfo_get_NodeType 9 int,var #comfunc global IKsTopologyInfo_CreateNodeInstance 10 int,var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IKsTopologyInfo "{720D4AC0-7533-11D0-A5D6-28DB04C10000}" #usecom global IKsTopologyInfo IID_IKsTopologyInfo "{}" #comfunc global IKsTopologyInfo_get_NumCategories 3 sptr #comfunc global IKsTopologyInfo_get_Category 4 int,sptr #comfunc global IKsTopologyInfo_get_NumConnections 5 sptr #comfunc global IKsTopologyInfo_get_ConnectionInfo 6 int,sptr #comfunc global IKsTopologyInfo_get_NodeName 7 int,sptr,int,sptr #comfunc global IKsTopologyInfo_get_NumNodes 8 sptr #comfunc global IKsTopologyInfo_get_NodeType 9 int,sptr #comfunc global IKsTopologyInfo_CreateNodeInstance 10 int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。