Win32 API 日本語リファレンス
ホームDevices.FunctionDiscovery › IFunctionDiscoveryProvider

IFunctionDiscoveryProvider

COM
IIDdcde394f-1478-4813-a402-f6fb10657222継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

これは検出プロバイダーが実装するメインのインターフェイスです。Function Discovery インフラストラクチャがプロバイダーおよびそのリソースと通信するために使用する主要なインターフェイスです。

メソッド 8

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Initialize(IFunctionDiscoveryProviderFactory* pIFunctionDiscoveryProviderFactory, IFunctionDiscoveryNotification* pIFunctionDiscoveryNotification, DWORD lcidUserDefault, DWORD* pdwStgAccessCapabilities)

Function Discovery プロバイダーオブジェクトを初期化します。

pIFunctionDiscoveryProviderFactoryIFunctionDiscoveryProviderFactory*inIFunctionDiscoveryProviderFactory インターフェイスへのポインター。プロバイダーは、新しい Function Discovery オブジェクトを作成するためにこのインターフェイスを使用する必要があります。
pIFunctionDiscoveryNotificationIFunctionDiscoveryNotification*inIFunctionDiscoveryNotification インターフェイスへのポインター。プロバイダーは、OnUpdateOnEventOnError の各通知を Function Discovery の通知キューに送信するためにこのインターフェイスを使用する必要があります。キューに入れられた通知は、Function Discovery によってクライアントプログラムに送信されます。
lcidUserDefaultDWORDin呼び出し元のロケール識別子。プロバイダーは、プロバイダーが列挙するリソースのローカライズされた文字列を返すために lcidUserDefault を使用する必要があります。
pdwStgAccessCapabilitiesDWORD*out

このプロバイダーが作成する関数インスタンスに関連付けられたプロパティストアの、最も制限の緩いアクセスモードを指定します。

DWORD 値が -1 に設定されている場合、このプロバイダーが作成した関数インスタンスに対して OpenPropertyStore が呼び出されるたびに InstancePropertyStoreValidateAccess が呼び出されます。それ以外の場合、このパラメーターで指定された値によって、このプロバイダーが作成するすべての関数インスタンスに関連付けられたすべてのプロパティストアで最も制限の緩いアクセスモードが決まります。クライアントが、指定された pdwStgAccessCapabilities 値よりも制限の厳しい値を dwStgAccess パラメーターに設定して OpenPropertyStore を呼び出した場合、個々のプロパティストアにはより制限の厳しいアクセスモードが適用されます。

効率のために、可能な限り pdwStgAccessCapabilities 値を指定してください。

サポートされるモードは次のとおりです。

STGM_READ

STGM_READWRITE

STGM_WRITE

戻り値

可能な戻り値には次のものがありますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは正常に完了しました。
E_INVALIDARG
いずれかのパラメーターに無効な引数が含まれています。

解説(Remarks)

プロバイダーで Function Discovery オブジェクトの作成、通知のキュー登録、またはローカライズされた文字列を含むリソースの列挙を行う場合は、Initialize メソッドを実装する際に、後で使用できるように、初期化された pIFunctionDiscoveryProviderFactorypIFunctionDiscoveryNotificationlcidUserDefault の各パラメーターに対して AddRef を呼び出してキャッシュしておく必要があります。

vtbl 4 HRESULT Query(IFunctionDiscoveryProviderQuery* pIFunctionDiscoveryProviderQuery, IFunctionInstanceCollection** ppIFunctionInstanceCollection)

指定された制約を満たす関数インスタンスのコレクションを取得します。

pIFunctionDiscoveryProviderQueryIFunctionDiscoveryProviderQuery*inクエリ条件を定義するパラメーターを含む IFunctionDiscoveryProviderQuery インターフェイスへのポインター。
ppIFunctionInstanceCollectionIFunctionInstanceCollection**out

指定されたクエリに応答して関数インスタンスを同期的に返すためにプロバイダーが使用する IFunctionInstanceCollection インターフェイスへのポインター。

Query メソッドを実装する際、プロバイダーが通知をサポートしている場合、つまりプロバイダーが結果を非同期に返す場合は、このパラメーターを NULL に設定できます。非同期の結果は、プロバイダーの Initialize メソッドに渡された IFunctionDiscoveryNotification インターフェイスを使用して返す必要があります。

クライアントアプリケーションが通知を実装していない場合は、NULL パラメーターを渡すことがあります。

戻り値

可能な戻り値には次のものがありますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは正常に完了し、結果は同期的に返されます。
E_INVALIDARG
pIFunctionDiscoveryProviderQuery パラメーターが NULL です。
E_PENDING
メソッドは正常に完了し、結果は非同期に返されます。

解説(Remarks)

アクティブなクエリは、EndQuery メソッドの呼び出しによって Function Discovery が終了させます。EndQuery は、クライアントがそのクエリに対して IFunctionDiscoveryNotification インターフェイスを指定した場合にのみ呼び出される点に注意してください。IFunctionDiscoveryNotification が指定されなかった場合、Query の呼び出しが完了した時点で、そのクエリはプロバイダーによって終了したものと見なす必要があります。

クライアントは、前回の Query 呼び出しが返された後であれば、いつでもクエリを再実行できます。Query の実装は、新しいクエリに対して IFunctionInstanceCollection を返せる必要があります。EndQuery が後続の Query 呼び出しの前に呼び出されるのは、クライアントがプロバイダーの Initialize メソッドに IFunctionDiscoveryNotification インターフェイスを渡した場合のみです。

QueryE_PENDING を返す場合、プロバイダーは、結果の列挙が完了したことを示すために、IFunctionDiscoveryNotification インターフェイスの OnEvent メソッドを FD_EVENTID_SEARCHCOMPLETE を指定して呼び出す必要があります。FD_EVENTID_SEARCHCOMPLETE イベントの送信に失敗すると、クライアントが無期限にハングする可能性があります。

vtbl 5 HRESULT EndQuery()

プロバイダーが実行しているクエリを終了します。

戻り値

可能な戻り値には次のものがありますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは正常に完了しました。
E_INVALIDARG
いずれかのパラメーターに無効な引数が含まれています。

解説(Remarks)

このメソッドは、それ以上のクエリ通知が IFunctionDiscoveryNotification コールバックインターフェイスに送信されないことをプロバイダーに通知するために、Function Discovery によって呼び出されます。実装者は、EndQuery の呼び出しが返された後に、それ以上のクエリ通知が Function Discovery に送信されないようにする必要があります。プロバイダーの実装が EndQuery の戻り後に通知を送信した場合、Function Discovery はプロバイダーにエラーを返し、その通知はクライアントに転送されません。

EndQuery が呼び出されるのは、クライアントがプロバイダーの Initialize メソッドに IFunctionDiscoveryNotification インターフェイスを渡した場合のみです。

クエリに関連付けられたデータ構造はすべて、EndQuery の実装内で削除できます。Query メソッドによって割り当てられたプライベートなコンテキストメモリもすべて削除する必要があります。

EndQuery が返された後は、Query を再度呼び出せる点に注意してください。

vtbl 6 HRESULT InstancePropertyStoreValidateAccess(IFunctionInstance* pIFunctionInstance, INT_PTR iProviderInstanceContext, DWORD dwStgAccess)

要求されたアクセスをプロバイダーがサポートしているかを検証します。

pIFunctionInstanceIFunctionInstance*inIFunctionInstance インターフェイスへのポインター。
iProviderInstanceContextINT_PTRin特定の関数インスタンスに関連付けられたコンテキスト。
dwStgAccessDWORDin

検証するアクセスモード。このメソッドでは、次のモードがサポートされています。

STGM_READ

STGM_READWRITE

STGM_WRITE

戻り値

可能な戻り値には次のものがありますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは正常に完了しました。
E_NOTIMPL
プロバイダーはインスタンスプロパティストアを実装していません。
STG_E_ACCESSDENIED
呼び出し元のアクセス権が不足している、検出プロバイダーがそのプロパティストアへの書き込みアクセスを許可していない、またはこの関数インスタンスに対して別のプロパティストアが既に開かれているため、書き込み可能なプロパティストアを開けませんでした。
E_INVALIDARG
dwStgAccess の値が無効です。
E_OUTOFMEMORY
メソッドは、この操作を実行するために必要なメモリを割り当てることができません。

解説(Remarks)

STG_E_ACCESSDENIED という戻り値の正確な意味は実装によって異なります。InstancePropertyStoreValidateAccess メソッドを実装する際は、渡された任意の関数インスタンスに対して、渡された任意の dwStgAccess モード値について STG_E_ACCESSDENIED を返すことができます。

vtbl 7 HRESULT InstancePropertyStoreOpen(IFunctionInstance* pIFunctionInstance, INT_PTR iProviderInstanceContext, DWORD dwStgAccess, IPropertyStore** ppIPropertyStore)

プロバイダーのプロパティストアを開きます。

pIFunctionInstanceIFunctionInstance*in開くストアの IFunctionInstance インターフェイスへのポインター。各プロパティストアは関数インスタンスに関連付けられています。
iProviderInstanceContextINT_PTRin特定の関数インスタンスに関連付けられたコンテキスト。
dwStgAccessDWORDin

開いたストリームに割り当てるアクセスモード。このメソッドでは、次のモードがサポートされています。

STGM_READ

STGM_READWRITE

STGM_WRITE

ppIPropertyStoreIPropertyStore**outIPropertyStore インターフェイスポインターへのポインター。

戻り値

可能な戻り値には次のものがありますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは正常に完了しました。
E_NOTIMPL
プロバイダーはインスタンスプロパティストアを実装していません。
STG_E_ACCESSDENIED
呼び出し元のアクセス権が不足している、検出プロバイダーがそのプロパティストアへの書き込みアクセスを許可していない、またはこの関数インスタンスに対して別のプロパティストアが既に開かれているため、書き込み可能なプロパティストアを開けませんでした。
E_INVALIDARG
いずれかのパラメーターに無効な引数が含まれています。
E_OUTOFMEMORY
メソッドは、この操作を実行するために必要なメモリを割り当てることができません。
vtbl 8 HRESULT InstancePropertyStoreFlush(IFunctionInstance* pIFunctionInstance, INT_PTR iProviderInstanceContext)

プロバイダーがプロパティを永続化するためのメカニズムを提供します。

pIFunctionInstanceIFunctionInstance*inIFunctionInstance インターフェイスへのポインター。
iProviderInstanceContextINT_PTRin特定の関数インスタンスに関連付けられたコンテキスト。

戻り値

このメソッドは次のいずれかの値を返すことがあります。

可能な戻り値には次のものがありますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは正常に完了しました。
E_NOTIMPL
プロバイダーはインスタンスプロパティストアを実装していません。
E_INVALIDARG
いずれかのパラメーターに無効な引数が含まれています。
E_OUTOFMEMORY
メソッドは、この操作を実行するために必要なメモリを割り当てることができません。

解説(Remarks)

プロバイダーが SetValue を通じて渡された新しい値をメモリ内にキャッシュしている場合、このメソッドは、更新された値を基盤となる API/ストアに永続化するコードを実装する必要があります。

このメソッドを実装する場合は、データを永続化する前に OpenPropertyStore を呼び出して現在のプロパティストアを返す必要があります。

vtbl 9 HRESULT InstanceQueryService(IFunctionInstance* pIFunctionInstance, INT_PTR iProviderInstanceContext, GUID* guidService, GUID* riid, IUnknown** ppIUnknown)

関数インスタンス用のプロバイダー固有の COM オブジェクトを作成します。

pIFunctionInstanceIFunctionInstance*inIFunctionInstance インターフェイスへのポインター。
iProviderInstanceContextINT_PTRin特定の関数インスタンスに関連付けられたコンテキスト。
guidServiceGUID*inサービスの一意の識別子 (SID)。これはプロバイダーの作成者が定義したサービス ID です。例については、FunctionDiscoveryServiceIDs.h を参照してください。
riidGUID*in呼び出し元がそのサービスに対して受け取ることを希望するインターフェイスの一意の識別子。
ppIUnknownIUnknown**outサービスのインターフェイスポインターを受け取るポインター。サービスが不要になったときに、このインターフェイスポインターを通じて Release を呼び出す責任は呼び出し元にあります。

戻り値

可能な戻り値には次のものがありますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは正常に完了しました。
E_NOINTERFACE
プロバイダーは guidService で識別されるサービスを実装していますが、rrid で識別されるインターフェイスは実装していません。
E_OUTOFMEMORY
メソッドは、この操作を実行するために必要なメモリを割り当てることができません。
E_NOTIMPL
プロバイダーが 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 サービスのサポートを実装しているわけではありません。

vtbl 10 HRESULT InstanceReleased(IFunctionInstance* pIFunctionInstance, INT_PTR iProviderInstanceContext)

指定された関数インスタンスを解放し、以前に割り当てられたメモリを解放します。

pIFunctionInstanceIFunctionInstance*inIFunctionInstance インターフェイスへのポインター。
iProviderInstanceContextINT_PTRin特定の関数インスタンスに関連付けられたコンテキスト。

戻り値

このメソッドは次のいずれかの値を返すことがあります。

可能な戻り値には次のものがありますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは正常に完了しました。
E_INVALIDARG
いずれかのパラメーターに無効な引数が含まれています。
E_OUTOFMEMORY
メソッドは、この操作を実行するために必要なメモリを割り当てることができません。

解説(Remarks)

このメソッドを実装する際は、必要に応じて ppvProviderInstanceContext 用に割り当てられたメモリをクリーンアップする必要があります。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。