IFunctionDiscovery
COM公式ドキュメント
このインターフェイスは、クライアントプログラムが関数インスタンスを検出したり、カテゴリの既定の関数インスタンスを取得したり、Function Discovery の既定値を登録できるようにするなど、高度な Function Discovery クエリオブジェクトを作成したりするために使用されます。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
カテゴリとサブカテゴリに基づいて、指定された関数インスタンスのコレクションを取得します。
| pszCategory | LPWSTR | in | 列挙するカテゴリの識別子。Category Definitions を参照してください。 |
| pszSubCategory | LPWSTR | in | 列挙するサブカテゴリの識別子。Subcategory Definitions を参照してください。このパラメーターは NULL にできます。 |
| fIncludeAllSubCategories | BOOL | in | TRUE の場合、このメソッドは pszCategory で指定されたカテゴリのすべてのサブカテゴリを再帰的に列挙し、pszCategory のすべてのサブカテゴリの関数インスタンスを含むコレクションを返します。 FALSE の場合、このメソッドは pszCategory で指定されたカテゴリと pszSubCategory で指定されたサブカテゴリの関数インスタンスの返却のみに限定されます。 |
| ppIFunctionInstanceCollection | IFunctionInstanceCollection** | out | 要求された関数インスタンスを含む関数インスタンスコレクションを受け取る IFunctionInstanceCollection インターフェイスポインターへのポインター。条件を満たす関数インスタンスが見つからない場合、コレクションは空になります。 |
戻り値
戻り値には、以下のものが含まれますが、これらに限定されません。
| リターンコード/値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| pszCategory の値が無効です。ppIFunctionInstanceCollection パラメーターで返される値は NULL です。 | |
| この操作の実行に必要なメモリを割り当てることができません。 | |
|
pszCategory または pszSubCategory の値が不明です。 |
| 結果を非同期的に返すプロバイダーに対して呼び出しが実行されました。 |
解説(Remarks)
一部の Function Discovery プロバイダーは、クエリ結果を IFunctionDiscoveryNotification インターフェイスで返します。GetInstanceCollection はこの方法で返される関数インスタンスを検出できず、E_PENDING で失敗します。このようなプロバイダーの関数インスタンスを検出するには、クライアントは IFunctionDiscovery インターフェイスの CreateInstanceQuery メソッドを使用することをお勧めします。
メソッドは成功したものの、クエリパラメーターに一致する関数インスタンスが見つからなかった場合は、S_OK が返され、ppFunctionInstanceCollection は空のコレクションを指します(コレクションの GetCount メソッドは 0 を返します)。
サブカテゴリクエリは、階層化カテゴリと一部のプロバイダーカテゴリでのみサポートされます。Registry Provider、PnP-X アソシエーションプロバイダー、およびパブリケーションプロバイダーはサブカテゴリクエリをサポートします。カスタムプロバイダーは、サブカテゴリクエリをサポートするように明示的に設計できます。その他のプロバイダーでは、クエリ制約を使用して関数インスタンスコレクションをフィルターできます。クエリ制約の一覧については、Constraint Definitions を参照してください。
例
次のコードは、Microsoft.Networking.Devices 名前空間の SSDP プロバイダーに関連付けられた関数インスタンスを返します。
hr = spDisco->GetInstanceCollection(FCTN_CATEGORY_NETWORKDEVICES,
FCTN_SUBCAT_NETWORKDEVICES_SSDP,
FALSE,
&spFunctionInstanceCollection);
複数のインターフェイスを一度にフィルターするか、サブカテゴリクエリをサポートしないプロバイダーをフィルターするには、IFunctionInstanceQuery のインターフェイス制約を参照してください。
識別子に基づいて、指定された関数インスタンスを取得します。
| pszFunctionInstanceIdentity | LPWSTR | in | 関数インスタンスの識別子(GetID を参照)。 |
| ppIFunctionInstance | IFunctionInstance** | out | インターフェイスを返すために使用される IFunctionInstance インターフェイスポインターへのポインター。 |
戻り値
戻り値には、以下のものが含まれますが、これらに限定されません。
| リターンコード/値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| pszFunctionInstanceIdentity の値が無効です。 | |
| この操作の実行に必要なメモリを割り当てることができません。 | |
|
指定された ID で表される関数インスタンスは、このコンピューター上に存在しません。 |
| 結果を非同期的に返すプロバイダーに対して呼び出しが実行されました。 |
解説(Remarks)
一部の Function Discovery プロバイダーは、クエリ結果を IFunctionDiscoveryNotification インターフェイスで返します。GetInstance はこの方法で返される関数インスタンスを検出できず、E_PENDING で失敗します。このようなプロバイダーの関数インスタンスを検出するには、クライアントは IFunctionDiscovery インターフェイスの CreateInstanceQuery メソッドを使用することをお勧めします。
特定の関数インスタンスのコレクションに対するクエリを作成します。
| pszCategory | LPWSTR | in | クエリのカテゴリ。Category Definitions を参照してください。 |
| pszSubCategory | LPWSTR | in | クエリのサブカテゴリ。Subcategory Definitions を参照してください。このパラメーターは NULL にできます。 サブカテゴリクエリは、階層化カテゴリと一部のプロバイダーカテゴリでのみサポートされます。Registry Provider、PnP-X アソシエーションプロバイダー、およびパブリケーションプロバイダーはサブカテゴリクエリをサポートします。カスタムプロバイダーは、サブカテゴリクエリをサポートするように明示的に設計できます。つまり、pszSubCategory パラメーターに非 NULL の値を設定するのは、pszCategory パラメーターに FCTN_CATEGORY_REGISTRY、FCTN_CATEGORY_PUBLICATION、FCTN_CATEGORY_PNPXASSOCIATION、または階層化カテゴリやサブカテゴリクエリをサポートするカスタムプロバイダーに対して定義されたカスタムカテゴリ値が設定されている場合のみにすべきです。 |
| fIncludeAllSubCategories | BOOL | in | TRUE の場合、このメソッドは pszCategory で指定されたカテゴリのすべてのサブカテゴリに対するクエリを再帰的に作成し、pszCategory のすべてのサブカテゴリの関数インスタンスを含むコレクションを返します。 FALSE の場合、このメソッドは、作成されるクエリを pszCategory で指定されたカテゴリと pszSubCategory で指定されたサブカテゴリの関数インスタンスの返却に限定します。 |
| pIFunctionDiscoveryNotification | IFunctionDiscoveryNotification* | in | 呼び出し側アプリケーションによって実装された IFunctionDiscoveryNotification インターフェイスへのポインター。このパラメーターは NULL にできます。このポインターは、返されたクエリオブジェクトが解放されるまで有効です。 |
| pfdqcQueryContext | ULONGLONG* | inout | クエリが作成されたコンテキストへのポインター。型 FDQUERYCONTEXT は DWORDLONG として定義されています。 |
| ppIFunctionInstanceCollectionQuery | IFunctionInstanceCollectionQuery** | out | IFunctionInstanceCollectionQuery インターフェイスポインターへのポインター。 |
戻り値
戻り値には、以下のものが含まれますが、これらに限定されません。
| リターンコード/値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| pszCategory または pIID の値が無効です。ppIFunctionInstanceCollectionQuery パラメーターで返される値は NULL です。 | |
| この操作の実行に必要なメモリを割り当てることができません。 | |
|
pszCategory または pszSubCategory の値が不明です。 |
解説(Remarks)
pIFunctionDiscoveryNotification を指定すると、Function Discovery の変更通知プロセスが有効になります。このパラメーターは NULL にできます。ただし、ネットワークプロバイダーは同期的な結果を返さないため、ネットワークプロバイダーでは必須です。Function Discovery のネットワークプロバイダーは、IFunctionDiscoveryNotification インターフェイスを通じてのみインスタンスを返します。
このメソッドはクエリ呼び出しを初期化するだけです。クエリを実行してデータを返すには、ppIFunctionInstanceCollectionQuery で返される IFunctionInstanceCollectionQuery インターフェイスの Execute メソッドを呼び出す必要があります。
特定の関数インスタンスに対するクエリを作成します。
| pszFunctionInstanceIdentity | LPWSTR | in | 関数インスタンスの識別子。 |
| pIFunctionDiscoveryNotification | IFunctionDiscoveryNotification* | in | 呼び出し側アプリケーションによって実装された IFunctionDiscoveryNotification インターフェイスへのポインター。指定すると、Function Discovery の変更通知プロセスが有効になります。このパラメーターは NULL にできますが、ネットワークプロバイダーでは必須です。 |
| pfdqcQueryContext | ULONGLONG* | inout | クエリが作成されたコンテキストへのポインター。型 FDQUERYCONTEXT は DWORDLONG として定義されています。 |
| ppIFunctionInstanceQuery | IFunctionInstanceQuery** | out | 生成されたクエリを返すために使用される IFunctionInstanceQuery インターフェイスポインターへのポインター。 |
戻り値
戻り値には、以下のものが含まれますが、これらに限定されません。
| リターンコード | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| ppIFunctionInstanceQuery が NULL です。 | |
| この操作の実行に必要なメモリを割り当てることができません。 |
解説(Remarks)
Function Discovery のネットワークプロバイダーは、IFunctionDiscoveryNotification インターフェイスを通じてのみインスタンスを返します。
このメソッドはクエリ呼び出しを初期化するだけです。クエリを実行してデータを返すには、ppIFunctionInstanceQuery で返される IFunctionInstanceQuery インターフェイスの Execute メソッドを呼び出す必要があります。
関数インスタンスを作成または変更します。
| enumSystemVisibility | SystemVisibilityFlags | in | 作成された関数インスタンスがシステム全体に表示されるか、現在のユーザーにのみ表示されるかを指定する SystemVisibilityFlags の値。 注意 enumSystemVisibility の値にかかわらず、関数インスタンスは HKEY_LOCAL_MACHINE に格納されます。関数インスタンスを追加するには、ユーザーは Administrator アクセス権を持っている必要があります。
|
| pszCategory | LPWSTR | in | 作成された関数インスタンスのカテゴリ。Category Definitions を参照してください。 |
| pszSubCategory | LPWSTR | in | 作成された関数インスタンスのサブカテゴリ。Subcategory Definitions を参照してください。この文字列の最大長は MAX_PATH です。 |
| pszCategoryIdentity | LPWSTR | in | プロバイダーインスタンスの識別子文字列。この文字列は GetProviderInstanceID から返されます。 |
| ppIFunctionInstance | IFunctionInstance** | out | 関数インスタンスを受け取る IFunctionInstance インターフェイスポインターへのポインター。 |
戻り値
戻り値には、以下のものが含まれますが、これらに限定されません。
| リターンコード/値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| enumSystemVisibility、pszCategory、または pszCategoryIdentity の値が無効です。 | |
| この操作の実行に必要なメモリを割り当てることができません。 | |
| 要求されたアクションを実行するためのアクセス権がユーザーに不足しています。 | |
| プロバイダーは、AddInstance メソッドを使用して関数インスタンスを直接追加することをサポートしていません。 | |
|
pszCategory または pszSubCategory の値が不明です。 |
| 無効なパラメーターが指定されました。このエラーは、pszSubCategory 文字列の長さが MAX_PATH を超える場合に返されます。 |
解説(Remarks)
このメソッドは、指定されたカテゴリとサブカテゴリに対して新しい関数インスタンスを一時的に作成します。カテゴリを実装するプロバイダーは、IFunctionDiscoveryProviderFactory::CreateInstance メソッドを使用して、新しく作成された関数インスタンスに関連付けられたメタデータを永続化する責任があります。
関連付けられたプロパティストアに値が 1 つもない場合、関数インスタンスはレジストリに書き込まれません。プロパティストアの値を確認するには、IFunctionInstance::OpenPropertyStore メソッドを使用してください。
指定されたカテゴリとサブカテゴリに対して関数インスタンスが既に存在する場合、既存のレジストリエントリが上書きされます。AddInstance メソッドは S_OK を返します。Function Discovery の変更通知プロセスは、enumQueryUpdateAction を QUA_CHANGE に設定して、呼び出し側アプリケーションの IFunctionDiscoveryNotification::OnUpdate メソッドを呼び出します。
レジストリプロバイダーを使用して関数インスタンスを追加または削除するには、HKEY_LOCAL_MACHINE\SYSTEM レジストリキーを変更するためのアクセス権(Administrator または Power User アクセス)が必要です。
カテゴリとサブカテゴリに基づいて、指定された関数インスタンスを削除します。
| enumSystemVisibility | SystemVisibilityFlags | in | 関数インスタンスをシステム全体から削除するか、現在のユーザーに対してのみ削除するかを指定する SystemVisibilityFlags の値。 |
| pszCategory | LPWSTR | in | 関数インスタンスのカテゴリ。Category Definitions を参照してください。 |
| pszSubCategory | LPWSTR | in | 削除する関数インスタンスのサブカテゴリ。Subcategory Definitions を参照してください。このパラメーターは NULL にできます。 |
| pszCategoryIdentity | LPWSTR | in | プロバイダーインスタンスの識別子文字列。この文字列は GetProviderInstanceID から返されます。 |
戻り値
戻り値には、以下のものが含まれますが、これらに限定されません。
| リターンコード/値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| pszCategoryIdentity の値が無効です。 | |
| この操作の実行に必要なメモリを割り当てることができません。 | |
| 要求されたアクションを実行するためのアクセス権がユーザーに不足しています。 | |
|
pszCategory または pszSubCategory の値が不明です。 |
解説(Remarks)
レジストリプロバイダーを使用して関数インスタンスを追加または削除するには、HKEY_LOCAL_MACHINE\SYSTEM レジストリキーを変更するためのアクセス権(Administrator または Power User アクセスレベル)が必要です。関数インスタンスをシステム全体から削除するには、ユーザーは Administrator アクセス権を持っている必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IFunctionDiscovery "{4DF99B70-E148-4432-B004-4C9EEB535A5E}" #usecom global IFunctionDiscovery IID_IFunctionDiscovery "{C72BE2EC-8E90-452C-B29A-AB8FF1C071FC}" #comfunc global IFunctionDiscovery_GetInstanceCollection 3 wstr,wstr,int,sptr #comfunc global IFunctionDiscovery_GetInstance 4 wstr,sptr #comfunc global IFunctionDiscovery_CreateInstanceCollectionQuery 5 wstr,wstr,int,sptr,var,sptr #comfunc global IFunctionDiscovery_CreateInstanceQuery 6 wstr,sptr,var,sptr #comfunc global IFunctionDiscovery_AddInstance 7 int,wstr,wstr,wstr,sptr #comfunc global IFunctionDiscovery_RemoveInstance 8 int,wstr,wstr,wstr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IFunctionDiscovery "{4DF99B70-E148-4432-B004-4C9EEB535A5E}" #usecom global IFunctionDiscovery IID_IFunctionDiscovery "{C72BE2EC-8E90-452C-B29A-AB8FF1C071FC}" #comfunc global IFunctionDiscovery_GetInstanceCollection 3 wstr,wstr,int,sptr #comfunc global IFunctionDiscovery_GetInstance 4 wstr,sptr #comfunc global IFunctionDiscovery_CreateInstanceCollectionQuery 5 wstr,wstr,int,sptr,sptr,sptr #comfunc global IFunctionDiscovery_CreateInstanceQuery 6 wstr,sptr,sptr,sptr #comfunc global IFunctionDiscovery_AddInstance 7 int,wstr,wstr,wstr,sptr #comfunc global IFunctionDiscovery_RemoveInstance 8 int,wstr,wstr,wstr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。