IADsClass
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
IADsClass インターフェイスは、任意の ADSI オブジェクトのクラス定義を提供するスキーマクラスオブジェクトを管理するために設計されています。その他のスキーマ管理インターフェイスには、属性定義用の IADsProperty や、属性構文用の IADsSyntax があります。
解説(Remarks)
スキーマオブジェクトは、対象ディレクトリのスキーマコンテナー内に整理されています。オブジェクトのスキーマクラスにアクセスするには、そのオブジェクトの Schema プロパティを使用し(すなわち IADs::get_Schema プロパティメソッドを呼び出し)、ADsPath 文字列を取得したうえで、その文字列を使ってスキーマクラスオブジェクトにバインドします。
例
次のコード例は、IADsClass インターフェイスの実装方法を示しています。
Dim obj As IADs
Dim cls As IADsClass
On Error GoTo Cleanup
Set obj = GetObject("WinNT://myMachine,computer")
Set cls = GetObject(obj.Schema)
' 必須プロパティと省略可能プロパティを調べます。
For Each p In cls.MandatoryProperties
MsgBox "Must-have: " & p
Next
For Each p In cls.OptionalProperties
MsgBox "May-have: " & p
Next
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set obj = Nothing
Set cls = Nothing
次のコード例は、IADsClass インターフェイスの実装方法を示しています。
HRESULT hr = S_OK;
IADsClass *pCls = NULL;
IADs *pADs;
BSTR bstrSchema;
VARIANT var;
hr = CoInitialize(NULL);
hr = ADsGetObject(L"WinNT://myComputer,computer",
IID_IADs,
(void**)&pADs);
if (FAILED(hr)) { goto Cleanup;}
hr = pADs->get_Schema(&bstrSchema);
pADs->Release();
if(FAILED(hr)) { goto Cleanup; }
hr = ADsGetObject(bstrSchema, IID_IADsClass, (void**)&pCls);
if(FAILED(hr)) { goto Cleanup; }
VariantInit(&var);
pCls->get_MandatoryProperties(&var);
hr = printVarArray(var);
VariantClear(&var);
pCls->get_OptionalProperties(&var);
hr = printVarArray(var);
Cleanup:
if(pCls)
pCls->Release();
if(pADs)
pADs->Release();
SysFreeString(bstrSchema);
VariantClear(&var);
CoUninitialize();
return hr;
次のコード例は、printVarArray 関数の実装方法を示しています。
HRESULT printVarArray(VARIANT var)
{
LONG lstart, lend;
VARIANT varItem;
HRESULT hr;
SAFEARRAY *sa = V_ARRAY( &var );
hr = SafeArrayGetLBound( sa, 1, &lstart );
hr = SafeArrayGetUBound( sa, 1, &lend );
VariantInit(&varItem);
for ( long idx=lstart; idx <= lend; idx++ ) {
hr = SafeArrayGetElement( sa, &idx, &varItem );
printf(" %S \n", V_BSTR(&varItem));
VariantClear(&varItem);
}
printf("\n");
return S_OK;
}
メソッド 30
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
| retval | LPWSTR* | out | クラスのプライマリインターフェイスのIIDを文字列で受け取る出力ポインタ。 |
| retval | LPWSTR* | out | クラスのCLSIDを文字列で受け取る出力ポインタ。 |
| bstrCLSID | LPWSTR | in | 設定するクラスのCLSIDを示す文字列。 |
| retval | LPWSTR* | out | クラスのオブジェクト識別子(OID)を示す文字列を受け取る出力ポインタ。 |
| bstrOID | LPWSTR | in | 設定するクラスのオブジェクト識別子(OID)を示す文字列。 |
| retval | VARIANT_BOOL* | out | クラスが抽象クラスならVARIANT_TRUEを受け取るVARIANT_BOOL出力ポインタ。 |
| fAbstract | VARIANT_BOOL | in | クラスを抽象クラスにする場合にVARIANT_TRUEを指定する。 |
| retval | VARIANT_BOOL* | out | クラスが補助クラスならVARIANT_TRUEを受け取るVARIANT_BOOL出力ポインタ。 |
| fAuxiliary | VARIANT_BOOL | in | クラスを補助クラスにする場合にVARIANT_TRUEを指定する。 |
| retval | VARIANT* | out | 必須プロパティ名の配列を保持するVARIANTを受け取る出力ポインタ。 |
| vMandatoryProperties | VARIANT | in | 設定する必須プロパティ名の配列を保持するVARIANT。 |
| retval | VARIANT* | out | 任意プロパティ名の配列を保持するVARIANTを受け取る出力ポインタ。 |
| vOptionalProperties | VARIANT | in | 設定する任意プロパティ名の配列を保持するVARIANT。 |
| retval | VARIANT* | out | 名前付けに使うプロパティ名の配列を保持するVARIANTを受け取る出力ポインタ。 |
| vNamingProperties | VARIANT | in | 設定する名前付け用プロパティ名の配列を保持するVARIANT。 |
| retval | VARIANT* | out | 継承元クラス名の配列を保持するVARIANTを受け取る出力ポインタ。 |
| vDerivedFrom | VARIANT | in | 設定する継承元クラス名の配列を保持するVARIANT。 |
| retval | VARIANT* | out | 継承する補助クラス名の配列を保持するVARIANTを受け取る出力ポインタ。 |
| vAuxDerivedFrom | VARIANT | in | 設定する継承補助クラス名の配列を保持するVARIANT。 |
| retval | VARIANT* | out | 親になりうるクラス名の配列を保持するVARIANTを受け取る出力ポインタ。 |
| vPossibleSuperiors | VARIANT | in | 設定する親になりうるクラス名の配列を保持するVARIANT。 |
| retval | VARIANT* | out | 格納可能な子クラス名の配列を保持するVARIANTを受け取る出力ポインタ。 |
| vContainment | VARIANT | in | 設定する格納可能な子クラス名の配列を保持するVARIANT。 |
| retval | VARIANT_BOOL* | out | クラスがコンテナならVARIANT_TRUEを受け取るVARIANT_BOOL出力ポインタ。 |
| fContainer | VARIANT_BOOL | in | クラスをコンテナにする場合にVARIANT_TRUEを指定する。 |
| retval | LPWSTR* | out | クラスのヘルプファイル名を示す文字列を受け取る出力ポインタ。 |
| bstrHelpFileName | LPWSTR | in | 設定するクラスのヘルプファイル名を示す文字列。 |
| retval | INT* | out | ヘルプファイル内のコンテキストID(トピック番号)を受け取る出力ポインタ。 |
| lnHelpFileContext | INT | in | 設定するヘルプファイル内のコンテキストID(トピック番号)。 |
このスキーマクラスに対する追加の修飾子(qualifier)を記述する ADSI オブジェクトのコレクションを返します。
| ppQualifiers | IADsCollection** | out | このスキーマクラスに対する追加の制限を表す ADSI コレクションオブジェクトへのインターフェイスポインターを受け取る、IADsCollection ポインター変数のアドレス。 |
戻り値
このメソッドは、標準の戻り値に加えて、次の値をサポートします。
詳細およびその他の戻り値については、ADSI エラーコード を参照してください。
解説(Remarks)
修飾子オブジェクトはプロバイダー固有です。サポートされている場合、このメソッドを使用して拡張スキーマデータを取得できます。
このメソッドは現在、いずれの Microsoft 製プロバイダーでもサポートされていません。
例
次のコード例は、このメソッドの使用方法を示しています。
Dim ads As IADs
Dim cls As IADsClass
On Error GoTo Cleanup
Set ads = GetObject("WinNT://myComputer, computer")
Set cls = GetObject(ads.Schema)
' 追加のクラスデータがどこにあるかをユーザーに表示します。
ListBox.additem "Additional class information can be found from:"
For Each q In cls.Qualifiers
listBox.additem q.Name
Next
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set ads = Nothing
Set cls = Nothing
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IADsClass "{C8F93DD0-4AE0-11CF-9E73-00AA004A5691}" #usecom global IADsClass IID_IADsClass "{}" #comfunc global IADsClass_get_PrimaryInterface 20 var #comfunc global IADsClass_get_CLSID 21 var #comfunc global IADsClass_put_CLSID 22 wstr #comfunc global IADsClass_get_OID 23 var #comfunc global IADsClass_put_OID 24 wstr #comfunc global IADsClass_get_Abstract 25 var #comfunc global IADsClass_put_Abstract 26 int #comfunc global IADsClass_get_Auxiliary 27 var #comfunc global IADsClass_put_Auxiliary 28 int #comfunc global IADsClass_get_MandatoryProperties 29 var #comfunc global IADsClass_put_MandatoryProperties 30 int #comfunc global IADsClass_get_OptionalProperties 31 var #comfunc global IADsClass_put_OptionalProperties 32 int #comfunc global IADsClass_get_NamingProperties 33 var #comfunc global IADsClass_put_NamingProperties 34 int #comfunc global IADsClass_get_DerivedFrom 35 var #comfunc global IADsClass_put_DerivedFrom 36 int #comfunc global IADsClass_get_AuxDerivedFrom 37 var #comfunc global IADsClass_put_AuxDerivedFrom 38 int #comfunc global IADsClass_get_PossibleSuperiors 39 var #comfunc global IADsClass_put_PossibleSuperiors 40 int #comfunc global IADsClass_get_Containment 41 var #comfunc global IADsClass_put_Containment 42 int #comfunc global IADsClass_get_Container 43 var #comfunc global IADsClass_put_Container 44 int #comfunc global IADsClass_get_HelpFileName 45 var #comfunc global IADsClass_put_HelpFileName 46 wstr #comfunc global IADsClass_get_HelpFileContext 47 var #comfunc global IADsClass_put_HelpFileContext 48 int #comfunc global IADsClass_Qualifiers 49 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_IADsClass "{C8F93DD0-4AE0-11CF-9E73-00AA004A5691}" #usecom global IADsClass IID_IADsClass "{}" #comfunc global IADsClass_get_PrimaryInterface 20 sptr #comfunc global IADsClass_get_CLSID 21 sptr #comfunc global IADsClass_put_CLSID 22 wstr #comfunc global IADsClass_get_OID 23 sptr #comfunc global IADsClass_put_OID 24 wstr #comfunc global IADsClass_get_Abstract 25 sptr #comfunc global IADsClass_put_Abstract 26 int #comfunc global IADsClass_get_Auxiliary 27 sptr #comfunc global IADsClass_put_Auxiliary 28 int #comfunc global IADsClass_get_MandatoryProperties 29 sptr #comfunc global IADsClass_put_MandatoryProperties 30 int #comfunc global IADsClass_get_OptionalProperties 31 sptr #comfunc global IADsClass_put_OptionalProperties 32 int #comfunc global IADsClass_get_NamingProperties 33 sptr #comfunc global IADsClass_put_NamingProperties 34 int #comfunc global IADsClass_get_DerivedFrom 35 sptr #comfunc global IADsClass_put_DerivedFrom 36 int #comfunc global IADsClass_get_AuxDerivedFrom 37 sptr #comfunc global IADsClass_put_AuxDerivedFrom 38 int #comfunc global IADsClass_get_PossibleSuperiors 39 sptr #comfunc global IADsClass_put_PossibleSuperiors 40 int #comfunc global IADsClass_get_Containment 41 sptr #comfunc global IADsClass_put_Containment 42 int #comfunc global IADsClass_get_Container 43 sptr #comfunc global IADsClass_put_Container 44 int #comfunc global IADsClass_get_HelpFileName 45 sptr #comfunc global IADsClass_put_HelpFileName 46 wstr #comfunc global IADsClass_get_HelpFileContext 47 sptr #comfunc global IADsClass_put_HelpFileContext 48 int #comfunc global IADsClass_Qualifiers 49 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。