IADsCollection
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
IADsCollection インターフェイスは、ホストとなる ADSI オブジェクトが、ディレクトリサービス用の名前付きデータ要素の任意の集合を定義および管理できるようにするデュアルインターフェイスです。
解説(Remarks)
ADSI システムプロバイダーのうち、このインターフェイスをサポートしているのは WinNT プロバイダーのみで、アクティブなファイルサービスのセッション、リソース、印刷ジョブを処理します。
メソッド 4
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
IADsCollection::get__NewEnum メソッドは、この ADSI コレクションオブジェクトに対して IEnumVARIANT を実装する従属列挙子オブジェクトを取得します。関数名にはアンダースコアが 2 つ含まれている点に注意してください (get__NewEnum)。
| ppEnumerator | IUnknown** | out | このコレクションの列挙子オブジェクト上の IUnknown インターフェイスへのポインターへのポインター。 |
戻り値
このメソッドは、S_OK、E_FAIL、E_NOTIMPL を含む標準的な戻り値をサポートします。詳細およびその他の戻り値については、ADSI エラーコードを参照してください。
解説(Remarks)
サーバーがページ検索をサポートしており、クライアントがサーバーで許可されている最大検索結果数を超えるページ制限を指定した場合、IADsCollection::get__NewEnum メソッドは次のような方法でエラーを返します:
- サーバーが結果を返さずにエラーを返した場合、この関数はエラーのみを返します。
- サーバーがエラーの有無にかかわらず部分的な結果 (たとえばサーバーで許可されている最大検索結果数) を返した場合、この関数はサーバーからの部分的な結果をユーザーに返します。
- サーバーがエラーの有無にかかわらずすべての結果 (たとえば各ページの最大検索結果数と複数ページにわたるすべての結果) を返した場合、この関数はサーバーからのすべての結果をユーザーに返します。
例
次の Visual Basic コード例の For Each…In…Next ステートメントは、get__NewEnum メソッドを暗黙的に呼び出します。
Dim fso As IADsFileServiceOperations
On Error GoTo Cleanup
Set fso = GetObject("WinNT://myComputer/Fabrikam01")
Dim coll As IADsCollection
Set coll = fso.Sessions
' The following statement invokes IADsCollection::get__NewEnum.
For Each session In coll
MsgBox "Session name: " & session.Name
Next session
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred... " & Err.Number)
End If
Set fso = Nothing
次の C++ コード例は、IADsCollection::get__NewEnum を使用してアクティブなファイルサービスセッションを列挙する方法を示しています。
HRESULT EnumCollection(IADsCollection *);
HRESULT GetACollectionOfSessions()
{
LPWSTR adspath = L"WinNT://myComputer/LanmanServer";
HRESULT hr = S_OK;
IADsCollection *pColl = NULL;
// Bind to file service operations.
IADsFileServiceOperations *pFso = NULL;
hr = ADsGetObject(adspath,
IID_IADsFileServiceOperations,
(void**)&pFso);
if(FAILED(hr)) {goto Cleanup;}
// Get the pointer to the collection.
hr = pFso->Sessions(&pColl);
if(FAILED(hr)) {goto Cleanup;}
hr = EnumCollection(pColl);
Cleanup:
if(pColl) pColl->Release();
if(pFso) pFso->Release();
return hr;
}
HRESULT EnumCollection(IADsCollection *pColl)
{
IUnknown *pUnk=NULL;
HRESULT hr = S_OK;
// Get the Enumerator object on the collection object.
hr = pColl->get__NewEnum(&pUnk);
if(FAILED(hr)) {goto Cleanup;}
IEnumVARIANT *pEnum;
hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
if(FAILED(hr)) {goto Cleanup;}
// Enumerate the collection.
BSTR bstr = NULL;
VARIANT var;
IADs *pADs = NULL;
ULONG lFetch;
IDispatch *pDisp = NULL;
VariantInit(&var);
hr = pEnum->Next(1, &var, &lFetch);
while(hr == S_OK)
{
if (lFetch == 1)
{
pDisp = V_DISPATCH(&var);
pDisp->QueryInterface(IID_IADs, (void**)&pADs);
pADs->get_Name(&bstr);
printf("Session name: %S\n",bstr);
SysFreeString(bstr);
pADs->Release();
}
VariantClear(&var);
pDisp->Release();
pDisp = NULL;
hr = pEnum->Next(1, &var, &lFetch);
};
Cleanup:
if(pDisp) pDisp->Release();
if(pUnk) pUnk->Release();
if(pColl) pColl->Release();
if(pEnum) pEnum->Release();
return hr;
}
名前付きの項目をコレクションに追加します。
| bstrName | LPWSTR | in | 項目名を指定する BSTR 値。IADsCollection::GetObject と IADsCollection::Remove は、この名前で項目を参照します。 |
| vItem | VARIANT | in | 項目の値。項目がオブジェクトの場合、このパラメーターはそのオブジェクト上の IDispatch インターフェイスポインターを保持します。 |
戻り値
このメソッドは、標準的な戻り値に加えて、以下の値をサポートします。
詳細およびその他の戻り値については、ADSI エラーコードを参照してください。
解説(Remarks)
ディレクトリサービスのコレクションは、変更不可能なオブジェクトの集合で構成される場合もあります。
このメソッドは、ADSI システムプロバイダーのいずれでもサポートされていません。
IADsCollection::Remove メソッドは、名前付きの項目をこの ADSI コレクションオブジェクトから削除します。
| bstrItemToBeRemoved | LPWSTR | in | IADsCollection::Add で指定されたとおりの項目名を指定する、null で終わる Unicode 文字列。 |
戻り値
このメソッドは、S_OK を含む標準的な戻り値をサポートします。詳細およびその他の戻り値については、ADSI エラーコードを参照してください。
解説(Remarks)
ディレクトリサービスのコレクションは、変更不可能なオブジェクトの集合で構成される場合もあります。
項目の直接の削除をサポートしないコレクションは、E_NOTIMPL を返す必要があります。
例
次の Visual Basic コード例は、アクティブなファイルサービスセッションのコレクションから、名前付きのセッションオブジェクトを削除する方法を示しています。
Dim fso As IADsFileServiceOperations
Dim ses As IADsSession
Dim coll As IADsCollection
Dim mySessionName As String
On Error GoTo Cleanup
Set fso = GetObject("WinNT://myComputer/FabrikamServer")
Set coll = fso.Sessions
' Insert code to set mySessionName to the name of the mySession
' session object.
' The following statement invokes IADsCollection::Remove.
coll.Remove mySessionName
Cleanup:
If (Err.Number<>0) Then
MsgBox("An error has occurred. " & Err.Number)
End If
Set fso = Nothing
Set ses = Nothing
Set coll = Nothing
次の C++ コード例は、アクティブなファイルサービスセッションのコレクションから、名前付きのセッションオブジェクトを削除する方法を示しています。
HRESULT RemoveASessionObjectFromCollection()
{
LPWSTR adspath = L"WinNT://myComputer/FabrikamServer";
HRESULT hr = S_OK;
IADsCollection *pColl = NULL;
IADsFileServiceOperations *pFso = NULL;
hr = ADsGetObject(adspath,IID_IADsFileServiceOperations,(void**)&pFso);
if(FAILED(hr)) {goto Cleanup;}
hr = pFso->Sessions(&pColl);
if(FAILED(hr)) {goto Cleanup;}
hr = pColl->Remove(CComBSTR("MySession"));
Cleanup
if(pFso) pFso->Release();
if(pColl) pColl->Release();
return hr;
}
コレクションの項目を取得します。
| bstrName | LPWSTR | in | 項目の名前を指定する、null で終わる Unicode 文字列。これは、項目がコレクションに追加される際に IADsCollection::Add に渡されたものと同じ名前です。 |
| pvItem | VARIANT* | out | 項目の現在の値。オブジェクトの場合、これはそのオブジェクト上の IDispatch インターフェイスポインターに対応します。 |
戻り値
このメソッドは、S_OK を含む標準的な戻り値をサポートします。詳細およびその他の戻り値については、ADSI エラーコードを参照してください。
解説(Remarks)
Sessions コレクション内のセッションの名前がわかっている場合は、IADsCollection::GetObject メソッドを明示的に呼び出してセッションオブジェクトを取得します。
例
次の Visual Basic コード例は、アクティブなファイルサービスセッションのコレクションから、名前付きのセッションオブジェクトを取得する方法を示しています。
Dim fso As IADsFileServiceOperations
Dim ses As IADsSession
Dim coll As IADsCollection
Dim mySessionName As String
Set fso = GetObject("WinNT://myComputer/FabrikamServer")
Set coll = fso.Sessions
' Insert code to set mySessionName to the name of mySession.
' The following statement invokes IADsCollection::GetObject.
Set ses = coll.GetObject(mySessionName)
次の C++ コード例は、アクティブなファイルサービスセッションのコレクションから、名前付きのセッションオブジェクトを取得する方法を示しています。
HRESULT GetASessionObjectFromCollection(BSTR mySession)
{
LPWSTR adspath = L"WinNT://myComputer/FabrikamServer";
IUnknown *pUnk=NULL;
HRESULT hr = S_OK;
IADsCollection *pColl = NULL;
IADsFileServiceOperations *pFso = NULL;
IADs *pADsObj = NULL;
VARIANT varObj;
BSTR bstrObj = NULL;
VariantInit(&varObj);
hr = ADsGetObject(adspath,
IID_IADsFileServiceOperations,
(void**)&pFso);
if(FAILED(hr)) {goto Cleanup;}
hr = pFso->Sessions(&pColl);
if(FAILED(hr)) {goto Cleanup;}
hr = pColl->GetObject(mySession, &varObj);
V_DISPATCH(&varObj)->QueryInterface(IID_IADs,(void**)&pADsObj);
hr = pADsObj->get_Class(&bstrObj);
printf("Class of the object obtained from GetObject: %S\n",
bstrObj);
Cleanup:
if(bstrObj) SysFreeString(bstrObj);
if(pFso) pFso->Release();
VariantClear(&varObj);
if(pADsObj) pADsObj->Release();
if(pColl) pColl->Release();
return hr;
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IADsCollection "{72B945E0-253B-11CF-A988-00AA006BC149}" #usecom global IADsCollection IID_IADsCollection "{}" #comfunc global IADsCollection_get__NewEnum 7 sptr #comfunc global IADsCollection_Add 8 wstr,int #comfunc global IADsCollection_Remove 9 wstr #comfunc global IADsCollection_GetObject 10 wstr,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_IADsCollection "{72B945E0-253B-11CF-A988-00AA006BC149}" #usecom global IADsCollection IID_IADsCollection "{}" #comfunc global IADsCollection_get__NewEnum 7 sptr #comfunc global IADsCollection_Add 8 wstr,int #comfunc global IADsCollection_Remove 9 wstr #comfunc global IADsCollection_GetObject 10 wstr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。