IADsExtension
COM公式ドキュメント
IADsExtension インターフェイスは、ADSI アプリケーション拡張モデルの基礎を成します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
プロバイダーの仕様に従って、コントロールコードと入力パラメーターを解釈します。
| dwCode | DWORD | in | ADSI 拡張コントロールコードの値。ADSI は次のコード値を定義します。 ADS_EXT_INITCREDENTIALS拡張オブジェクト内でユーザー資格情報を検証します。 |
| varData1 | VARIANT | in | 拡張オブジェクトが操作対象とする、プロバイダーから提供されるデータ。値はコントロールコードの値に依存し、現在は未定義です。 |
| varData2 | VARIANT | in | 拡張オブジェクトが操作対象とする、プロバイダーから提供されるデータ。値はコントロールコードの値に依存し、現在は未定義です。 |
| varData3 | VARIANT | in | 拡張オブジェクトが操作対象とする、プロバイダーから提供されるデータ。値はコントロールコードの値に依存し、現在は未定義です。 |
戻り値
このメソッドは標準の戻り値に加えて、次の値をサポートします。
その他の戻り値の詳細については、ADSI Error Codes を参照してください。
解説(Remarks)
アグリゲーターは E_FAIL および E_NOTIMPL の戻り値を無視します。
例
次の C/C++ コード例は、一般的な実装を示しています。
STDMETHOD(Operate)(ULONG dwCode, VARIANT varData1, VARIANT varData2, VARIANT varData3)
{
HRESULT hr = S_OK;
switch (dwCode)
{
case ADS_EXT_INITCREDENTIALS:
// Prompt for a credential.
// MessageBox(NULL, "INITCRED", "ADsExt", MB_OK);
break;
default:
hr = E_FAIL;
break;
}
return hr;
}
IADsExtension::PrivateGetIDsOfNames メソッドは、拡張機能がデュアルインターフェイスまたはディスパッチインターフェイスをサポートするために使用されると ADSI が判断した後、アグリゲーターである ADSI によって呼び出されます。このメソッドは、型データを使用して IDispatch::GetIDsOfNames により DISPID を取得できます。
| riid | GUID* | in | 将来の使用のために予約されています。IID_NULL である必要があります。 |
| rgszNames | WORD** | in | マッピング対象として渡される名前の配列。 |
| cNames | DWORD | in | マッピングされる名前の個数。 |
| lcid | DWORD | in | 名前を解釈するロケールコンテキスト。 |
| rgDispid | INT* | out | 呼び出し元が割り当てた配列。各要素には、rgszNames 配列で渡された名前のいずれかに対応する識別子が格納されます。最初の要素はメンバー名を表します。後続の要素は、そのメンバーの各パラメーターを表します。 |
戻り値
戻り値は、標準の IDispatch::GetIDsOfNames メソッドと同じです。その他の戻り値の詳細については、ADSI Error Codes を参照してください。
解説(Remarks)
すべてのパラメーターは、標準の IDispatch::GetIDsOfNames() の対応するパラメーターと同じ意味を持ちます。拡張コンポーネントは、サポートされるデュアルインターフェイスで定義された各メソッドまたはプロパティに対して、一意の識別子 (rgDispID) を返します。一意性は拡張コンポーネント内で保証されます。ADSI プロバイダーは、すべての拡張オブジェクトおよびアグリゲーター (ADSI) 自体の DISPID の一意性を保証する必要があります。rgDispID パラメーターは 1 から 16777215 (2^24-1) の範囲、または -1 (DISPID_UNKNOWN) である必要があります。
例
次の C/C++ コード例は、このメソッドの一般的な実装を示しています。
STDMETHOD(PrivateGetIDsOfNames)(REFIID riid, OLECHAR ** rgszNames, unsigned int cNames, LCID lcid, DISPID * rgdispid)
{
if (rgdispid == NULL)
{
return E_POINTER;
}
return DispGetIDsOfNames(m_pTypeInfo, rgszNames, cNames, rgdispid);
}
IADsExtension::PrivateInvoke メソッドは、通常、IADsExtension::PrivateGetIDsOfNames メソッドの後に ADSI によって呼び出されます。このメソッドは、独自の実装を持つことも、操作を IDispatch::DispInvoke メソッドに委譲することもできます。
| dispidMember | INT | in | メンバーを識別します。ディスパッチ識別子を取得するには、IADsExtension::PrivateGetIDsOfNames メソッドを使用します。 |
| riid | GUID* | in | 将来の使用のために予約されています。IID_NULL である必要があります。 |
| lcid | DWORD | in | 引数を解釈するロケールコンテキスト。IADsExtension::PrivateGetIDsOfNames 関数は lcid を使用します。lcid は PrivateInvoke メソッドにも渡され、オブジェクトがロケール固有の引数を解釈できるようにします。 |
| wFlags | WORD | in | PrivateInvoke 呼び出しのコンテキストを記述するフラグ。次のものが含まれます。 DISPATCH_METHODメンバーはメソッドとして呼び出されます。同じ名前のプロパティがある場合は、このフラグと DISPATCH_PROPERTYGET フラグの両方が設定されることがあります。 DISPATCH_PROPERTYGETメンバーはプロパティまたはデータメンバーとして取得されます。 DISPATCH_PROPERTYPUTメンバーはプロパティまたはデータメンバーとして変更されます。 DISPATCH_PROPERTYPUTREFメンバーは値の代入ではなく、参照の代入によって変更されます。このフラグは、プロパティがオブジェクトへの参照を受け付ける場合にのみ有効です。 |
| pdispparams | DISPPARAMS* | in | 引数の配列、名前付き引数の引数 DISPID の配列、および各配列の要素数を受け取る DISPPARAMS 構造体へのポインター。 |
| pvarResult | VARIANT* | out | 結果が格納される場所へのポインター。呼び出し元が結果を期待しない場合は NULL。DISPATCH_PROPERTYPUT または DISPATCH_PROPERTYPUTREF が指定されている場合、この引数は無視されます。 |
| pexcepinfo | EXCEPINFO* | out | 例外データを格納する構造体へのポインター。DISP_E_EXCEPTION が返される場合は、この構造体に値を設定する必要があります。NULL を指定できます。 |
| puArgErr | DWORD* | out | pdispparams 内の DISPPARAMS 構造体の rgvarg メンバー内で、エラーのある最初の引数のインデックス。引数は rgvarg 配列に逆順で格納されるため、最初の引数は配列内で最も大きいインデックスを持つものになります。このパラメーターは、戻り値が DISP_E_TYPEMISMATCH または DISP_E_PARAMNOTFOUND の場合にのみ返されます。 |
戻り値
このメソッドは標準の戻り値に加えて、次の値をサポートします。
その他の戻り値の詳細については、ADSI Error Codes を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IADsExtension "{3D35553C-D2B0-11D1-B17B-0000F87593A0}" #usecom global IADsExtension IID_IADsExtension "{}" #comfunc global IADsExtension_Operate 3 int,int,int,int #comfunc global IADsExtension_PrivateGetIDsOfNames 4 var,var,int,int,var #comfunc global IADsExtension_PrivateInvoke 5 int,var,int,int,var,var,var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IADsExtension "{3D35553C-D2B0-11D1-B17B-0000F87593A0}" #usecom global IADsExtension IID_IADsExtension "{}" #comfunc global IADsExtension_Operate 3 int,int,int,int #comfunc global IADsExtension_PrivateGetIDsOfNames 4 sptr,sptr,int,int,sptr #comfunc global IADsExtension_PrivateInvoke 5 int,sptr,int,int,sptr,sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。