IInternalUnknown
COM公式ドキュメント
IInternalUnknown (objidlbase.h) インターフェイスは、プロキシ上の内部インターフェイスへのアクセスを必要とする軽量なクライアント側ハンドラーで使用されます。
解説(Remarks)
プロキシマネージャー上の一部の内部インターフェイスへのアクセスを必要とするハンドラーは、IInternalUnknown インターフェイスを経由する必要があります。これにより、ハンドラーが無条件に委任して、集約対象オブジェクトの内部インターフェイスを集約の外部に公開してしまうことを防ぎます。これらのインターフェイスには、IClientSecurity と IMultiQI が含まれます。ハンドラーが IClientSecurity または IMultiQI を公開したい場合は、ハンドラー自身がこれらのインターフェイスを実装し、適切なタイミングでプロキシマネージャーによるこれらのインターフェイスの実装に委任する必要があります。
IClientSecurity インターフェイスの場合、クライアントがハンドラーの公開したインターフェイスにセキュリティを設定しようとしたときは、ハンドラーは基になるネットワークインターフェイスプロキシにセキュリティを設定する必要があります。
IMultiQI インターフェイスの場合、ハンドラーは自身が把握しているインターフェイスを埋め、その後、残りのインターフェイスを埋めるためにプロキシマネージャーへ呼び出しを転送する必要があります。
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
IInternalUnknown::QueryInternalInterface (objidlbase.h) メソッドは、オブジェクトがサポートする内部インターフェイスへのポインターを取得します。
| riid | GUID* | in | 要求される内部インターフェイスの識別子です。 |
| ppv | void** | out | riid パラメーターで要求されたインターフェイスポインターを受け取るポインター変数のアドレスです。呼び出しが成功すると、ppv には要求されたオブジェクトのインターフェイスポインターが格納されます。オブジェクトがそのインターフェイスをサポートしていない場合、ppv は NULL に設定されます。 |
戻り値
このメソッドは、インターフェイスがサポートされている場合は S_OK を返し、そうでない場合は E_NOINTERFACE を返します。
解説(Remarks)
このメソッドは IUnknown::QueryInterface メソッドに似ていますが、COM プロキシマネージャーは集約されている場合、一部のインターフェイスを QueryInterface を通じて公開しません。その代わりに、これらの内部インターフェイスは QueryInternalInterface を通じて公開する必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IInternalUnknown "{00000021-0000-0000-C000-000000000046}" #usecom global IInternalUnknown IID_IInternalUnknown "{}" #comfunc global IInternalUnknown_QueryInternalInterface 3 var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IInternalUnknown "{00000021-0000-0000-C000-000000000046}" #usecom global IInternalUnknown IID_IInternalUnknown "{}" #comfunc global IInternalUnknown_QueryInternalInterface 3 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。