IFunctionDiscoveryProvider
COM公式ドキュメント
これは検出プロバイダーが実装するメインのインターフェイスです。Function Discovery インフラストラクチャがプロバイダーおよびそのリソースと通信するために使用する主要なインターフェイスです。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Function Discovery プロバイダーオブジェクトを初期化します。
| pIFunctionDiscoveryProviderFactory | IFunctionDiscoveryProviderFactory* | in | IFunctionDiscoveryProviderFactory インターフェイスへのポインター。プロバイダーは、新しい Function Discovery オブジェクトを作成するためにこのインターフェイスを使用する必要があります。 |
| pIFunctionDiscoveryNotification | IFunctionDiscoveryNotification* | in | IFunctionDiscoveryNotification インターフェイスへのポインター。プロバイダーは、OnUpdate、OnEvent、OnError の各通知を Function Discovery の通知キューに送信するためにこのインターフェイスを使用する必要があります。キューに入れられた通知は、Function Discovery によってクライアントプログラムに送信されます。 |
| lcidUserDefault | DWORD | in | 呼び出し元のロケール識別子。プロバイダーは、プロバイダーが列挙するリソースのローカライズされた文字列を返すために lcidUserDefault を使用する必要があります。 |
| pdwStgAccessCapabilities | DWORD* | out | このプロバイダーが作成する関数インスタンスに関連付けられたプロパティストアの、最も制限の緩いアクセスモードを指定します。 DWORD 値が -1 に設定されている場合、このプロバイダーが作成した関数インスタンスに対して OpenPropertyStore が呼び出されるたびに InstancePropertyStoreValidateAccess が呼び出されます。それ以外の場合、このパラメーターで指定された値によって、このプロバイダーが作成するすべての関数インスタンスに関連付けられたすべてのプロパティストアで最も制限の緩いアクセスモードが決まります。クライアントが、指定された pdwStgAccessCapabilities 値よりも制限の厳しい値を dwStgAccess パラメーターに設定して OpenPropertyStore を呼び出した場合、個々のプロパティストアにはより制限の厳しいアクセスモードが適用されます。 効率のために、可能な限り pdwStgAccessCapabilities 値を指定してください。 サポートされるモードは次のとおりです。 STGM_READSTGM_READWRITESTGM_WRITE |
戻り値
可能な戻り値には次のものがありますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| いずれかのパラメーターに無効な引数が含まれています。 |
解説(Remarks)
プロバイダーで Function Discovery オブジェクトの作成、通知のキュー登録、またはローカライズされた文字列を含むリソースの列挙を行う場合は、Initialize メソッドを実装する際に、後で使用できるように、初期化された pIFunctionDiscoveryProviderFactory、pIFunctionDiscoveryNotification、lcidUserDefault の各パラメーターに対して AddRef を呼び出してキャッシュしておく必要があります。
指定された制約を満たす関数インスタンスのコレクションを取得します。
| pIFunctionDiscoveryProviderQuery | IFunctionDiscoveryProviderQuery* | in | クエリ条件を定義するパラメーターを含む IFunctionDiscoveryProviderQuery インターフェイスへのポインター。 |
| ppIFunctionInstanceCollection | IFunctionInstanceCollection** | out | 指定されたクエリに応答して関数インスタンスを同期的に返すためにプロバイダーが使用する IFunctionInstanceCollection インターフェイスへのポインター。 Query メソッドを実装する際、プロバイダーが通知をサポートしている場合、つまりプロバイダーが結果を非同期に返す場合は、このパラメーターを NULL に設定できます。非同期の結果は、プロバイダーの Initialize メソッドに渡された IFunctionDiscoveryNotification インターフェイスを使用して返す必要があります。 クライアントアプリケーションが通知を実装していない場合は、NULL パラメーターを渡すことがあります。 |
戻り値
可能な戻り値には次のものがありますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了し、結果は同期的に返されます。 | |
| pIFunctionDiscoveryProviderQuery パラメーターが NULL です。 | |
| メソッドは正常に完了し、結果は非同期に返されます。 |
解説(Remarks)
アクティブなクエリは、EndQuery メソッドの呼び出しによって Function Discovery が終了させます。EndQuery は、クライアントがそのクエリに対して IFunctionDiscoveryNotification インターフェイスを指定した場合にのみ呼び出される点に注意してください。IFunctionDiscoveryNotification が指定されなかった場合、Query の呼び出しが完了した時点で、そのクエリはプロバイダーによって終了したものと見なす必要があります。
クライアントは、前回の Query 呼び出しが返された後であれば、いつでもクエリを再実行できます。Query の実装は、新しいクエリに対して IFunctionInstanceCollection を返せる必要があります。EndQuery が後続の Query 呼び出しの前に呼び出されるのは、クライアントがプロバイダーの Initialize メソッドに IFunctionDiscoveryNotification インターフェイスを渡した場合のみです。
Query が E_PENDING を返す場合、プロバイダーは、結果の列挙が完了したことを示すために、IFunctionDiscoveryNotification インターフェイスの OnEvent メソッドを FD_EVENTID_SEARCHCOMPLETE を指定して呼び出す必要があります。FD_EVENTID_SEARCHCOMPLETE イベントの送信に失敗すると、クライアントが無期限にハングする可能性があります。
プロバイダーが実行しているクエリを終了します。
戻り値
可能な戻り値には次のものがありますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| いずれかのパラメーターに無効な引数が含まれています。 |
解説(Remarks)
このメソッドは、それ以上のクエリ通知が IFunctionDiscoveryNotification コールバックインターフェイスに送信されないことをプロバイダーに通知するために、Function Discovery によって呼び出されます。実装者は、EndQuery の呼び出しが返された後に、それ以上のクエリ通知が Function Discovery に送信されないようにする必要があります。プロバイダーの実装が EndQuery の戻り後に通知を送信した場合、Function Discovery はプロバイダーにエラーを返し、その通知はクライアントに転送されません。
EndQuery が呼び出されるのは、クライアントがプロバイダーの Initialize メソッドに IFunctionDiscoveryNotification インターフェイスを渡した場合のみです。
クエリに関連付けられたデータ構造はすべて、EndQuery の実装内で削除できます。Query メソッドによって割り当てられたプライベートなコンテキストメモリもすべて削除する必要があります。
EndQuery が返された後は、Query を再度呼び出せる点に注意してください。
要求されたアクセスをプロバイダーがサポートしているかを検証します。
| pIFunctionInstance | IFunctionInstance* | in | IFunctionInstance インターフェイスへのポインター。 |
| iProviderInstanceContext | INT_PTR | in | 特定の関数インスタンスに関連付けられたコンテキスト。 |
| dwStgAccess | DWORD | in | 検証するアクセスモード。このメソッドでは、次のモードがサポートされています。 STGM_READSTGM_READWRITESTGM_WRITE |
戻り値
可能な戻り値には次のものがありますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| プロバイダーはインスタンスプロパティストアを実装していません。 | |
| 呼び出し元のアクセス権が不足している、検出プロバイダーがそのプロパティストアへの書き込みアクセスを許可していない、またはこの関数インスタンスに対して別のプロパティストアが既に開かれているため、書き込み可能なプロパティストアを開けませんでした。 | |
| dwStgAccess の値が無効です。 | |
| メソッドは、この操作を実行するために必要なメモリを割り当てることができません。 |
解説(Remarks)
STG_E_ACCESSDENIED という戻り値の正確な意味は実装によって異なります。InstancePropertyStoreValidateAccess メソッドを実装する際は、渡された任意の関数インスタンスに対して、渡された任意の dwStgAccess モード値について STG_E_ACCESSDENIED を返すことができます。
プロバイダーのプロパティストアを開きます。
| pIFunctionInstance | IFunctionInstance* | in | 開くストアの IFunctionInstance インターフェイスへのポインター。各プロパティストアは関数インスタンスに関連付けられています。 |
| iProviderInstanceContext | INT_PTR | in | 特定の関数インスタンスに関連付けられたコンテキスト。 |
| dwStgAccess | DWORD | in | 開いたストリームに割り当てるアクセスモード。このメソッドでは、次のモードがサポートされています。 STGM_READSTGM_READWRITESTGM_WRITE |
| ppIPropertyStore | IPropertyStore** | out | IPropertyStore インターフェイスポインターへのポインター。 |
戻り値
可能な戻り値には次のものがありますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| プロバイダーはインスタンスプロパティストアを実装していません。 | |
| 呼び出し元のアクセス権が不足している、検出プロバイダーがそのプロパティストアへの書き込みアクセスを許可していない、またはこの関数インスタンスに対して別のプロパティストアが既に開かれているため、書き込み可能なプロパティストアを開けませんでした。 | |
| いずれかのパラメーターに無効な引数が含まれています。 | |
| メソッドは、この操作を実行するために必要なメモリを割り当てることができません。 |
プロバイダーがプロパティを永続化するためのメカニズムを提供します。
| pIFunctionInstance | IFunctionInstance* | in | IFunctionInstance インターフェイスへのポインター。 |
| iProviderInstanceContext | INT_PTR | in | 特定の関数インスタンスに関連付けられたコンテキスト。 |
戻り値
このメソッドは次のいずれかの値を返すことがあります。
可能な戻り値には次のものがありますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| プロバイダーはインスタンスプロパティストアを実装していません。 | |
| いずれかのパラメーターに無効な引数が含まれています。 | |
| メソッドは、この操作を実行するために必要なメモリを割り当てることができません。 |
解説(Remarks)
プロバイダーが SetValue を通じて渡された新しい値をメモリ内にキャッシュしている場合、このメソッドは、更新された値を基盤となる API/ストアに永続化するコードを実装する必要があります。
このメソッドを実装する場合は、データを永続化する前に OpenPropertyStore を呼び出して現在のプロパティストアを返す必要があります。
関数インスタンス用のプロバイダー固有の COM オブジェクトを作成します。
| pIFunctionInstance | IFunctionInstance* | in | IFunctionInstance インターフェイスへのポインター。 |
| iProviderInstanceContext | INT_PTR | in | 特定の関数インスタンスに関連付けられたコンテキスト。 |
| guidService | GUID* | in | サービスの一意の識別子 (SID)。これはプロバイダーの作成者が定義したサービス ID です。例については、FunctionDiscoveryServiceIDs.h を参照してください。 |
| riid | GUID* | in | 呼び出し元がそのサービスに対して受け取ることを希望するインターフェイスの一意の識別子。 |
| ppIUnknown | IUnknown** | out | サービスのインターフェイスポインターを受け取るポインター。サービスが不要になったときに、このインターフェイスポインターを通じて Release を呼び出す責任は呼び出し元にあります。 |
戻り値
可能な戻り値には次のものがありますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| プロバイダーは guidService で識別されるサービスを実装していますが、rrid で識別されるインターフェイスは実装していません。 | |
| メソッドは、この操作を実行するために必要なメモリを割り当てることができません。 | |
| プロバイダーが IFunctionInstance::QueryService メソッドを実装していないか、guidService で指定されたサービス識別子がプロバイダーのサービス識別子と一致しません。 |
解説(Remarks)
InstanceQueryService は、guidService で識別されるサービスの実装を作成またはそれにアクセスし、riid で指定されたインターフェイスのアドレスを ppv 引数で返します。プロバイダーはサービスを実装でき、このメソッドは、サービスを実装するための新しいオブジェクトの作成を必要とせずに、プロバイダーがこの実装を提供するためのメカニズムを提供します。
guidService がこのプロバイダーに属していない場合、または riid インターフェイスがサポートされていない場合、プロバイダーは E_NOINTERFACE を返す必要があります。このメソッドを単に実装していない場合、または要求された SID を実装していない場合、プロバイダーは E_NOTIMPL を返す必要があります。
埋め込みサービスまたはデバイスをサポートするプロバイダーは、SID_PNPXServiceCollection サービスを実装する必要があります。SID_PNPXServiceCollection サービスがサポートされている場合、クライアントは IFunctionInstance::QueryService を呼び出して、埋め込みサービスまたはデバイスに関連付けられた情報やメタデータにアクセスできます。たとえば、PnP-X プロバイダー (つまり SSDP プロバイダー と WSD プロバイダー) は、SID_PNPXServiceCollection サービスのサポートを実装しています。すべてのプロバイダーが SID_PNPXServiceCollection サービスのサポートを実装しているわけではありません。
指定された関数インスタンスを解放し、以前に割り当てられたメモリを解放します。
| pIFunctionInstance | IFunctionInstance* | in | IFunctionInstance インターフェイスへのポインター。 |
| iProviderInstanceContext | INT_PTR | in | 特定の関数インスタンスに関連付けられたコンテキスト。 |
戻り値
このメソッドは次のいずれかの値を返すことがあります。
可能な戻り値には次のものがありますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
| いずれかのパラメーターに無効な引数が含まれています。 | |
| メソッドは、この操作を実行するために必要なメモリを割り当てることができません。 |
解説(Remarks)
このメソッドを実装する際は、必要に応じて ppvProviderInstanceContext 用に割り当てられたメモリをクリーンアップする必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IFunctionDiscoveryProvider "{DCDE394F-1478-4813-A402-F6FB10657222}" #usecom global IFunctionDiscoveryProvider IID_IFunctionDiscoveryProvider "{}" #comfunc global IFunctionDiscoveryProvider_Initialize 3 sptr,sptr,int,var #comfunc global IFunctionDiscoveryProvider_Query 4 sptr,sptr #comfunc global IFunctionDiscoveryProvider_EndQuery 5 #comfunc global IFunctionDiscoveryProvider_InstancePropertyStoreValidateAccess 6 sptr,sptr,int #comfunc global IFunctionDiscoveryProvider_InstancePropertyStoreOpen 7 sptr,sptr,int,sptr #comfunc global IFunctionDiscoveryProvider_InstancePropertyStoreFlush 8 sptr,sptr #comfunc global IFunctionDiscoveryProvider_InstanceQueryService 9 sptr,sptr,var,var,sptr #comfunc global IFunctionDiscoveryProvider_InstanceReleased 10 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IFunctionDiscoveryProvider "{DCDE394F-1478-4813-A402-F6FB10657222}" #usecom global IFunctionDiscoveryProvider IID_IFunctionDiscoveryProvider "{}" #comfunc global IFunctionDiscoveryProvider_Initialize 3 sptr,sptr,int,sptr #comfunc global IFunctionDiscoveryProvider_Query 4 sptr,sptr #comfunc global IFunctionDiscoveryProvider_EndQuery 5 #comfunc global IFunctionDiscoveryProvider_InstancePropertyStoreValidateAccess 6 sptr,sptr,int #comfunc global IFunctionDiscoveryProvider_InstancePropertyStoreOpen 7 sptr,sptr,int,sptr #comfunc global IFunctionDiscoveryProvider_InstancePropertyStoreFlush 8 sptr,sptr #comfunc global IFunctionDiscoveryProvider_InstanceQueryService 9 sptr,sptr,sptr,sptr,sptr #comfunc global IFunctionDiscoveryProvider_InstanceReleased 10 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。