Win32 API 日本語リファレンス
ホームNetworking.ActiveDirectory › IADsCollection

IADsCollection

COMIDispatch (デュアル)
IDispatch を実装(デュアルインターフェース)。HSP では comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。
IID72b945e0-253b-11cf-a988-00aa006bc149継承元IDispatch呼び出し名前(IDispatch) または vtbl自前メソッド開始 vtbl7

公式ドキュメント

IADsCollection インターフェイスは、ホストとなる ADSI オブジェクトが、ディレクトリサービス用の名前付きデータ要素の任意の集合を定義および管理できるようにするデュアルインターフェイスです。

解説(Remarks)

ADSI システムプロバイダーのうち、このインターフェイスをサポートしているのは WinNT プロバイダーのみで、アクティブなファイルサービスのセッション、リソース、印刷ジョブを処理します。

メソッド 4

vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。

vtbl 7 HRESULT get__NewEnum(IUnknown** ppEnumerator)

IADsCollection::get__NewEnum メソッドは、この ADSI コレクションオブジェクトに対して IEnumVARIANT を実装する従属列挙子オブジェクトを取得します。関数名にはアンダースコアが 2 つ含まれている点に注意してください (get__NewEnum)。

ppEnumeratorIUnknown**outこのコレクションの列挙子オブジェクト上の IUnknown インターフェイスへのポインターへのポインター。

戻り値

このメソッドは、S_OKE_FAILE_NOTIMPL を含む標準的な戻り値をサポートします。詳細およびその他の戻り値については、ADSI エラーコードを参照してください。

解説(Remarks)

サーバーがページ検索をサポートしており、クライアントがサーバーで許可されている最大検索結果数を超えるページ制限を指定した場合、IADsCollection::get__NewEnum メソッドは次のような方法でエラーを返します:

次の Visual Basic コード例の For EachInNext ステートメントは、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;
}
vtbl 8 HRESULT Add(LPWSTR bstrName, VARIANT vItem)

名前付きの項目をコレクションに追加します。

bstrNameLPWSTRin項目名を指定する BSTR 値。IADsCollection::GetObjectIADsCollection::Remove は、この名前で項目を参照します。
vItemVARIANTin項目の値。項目がオブジェクトの場合、このパラメーターはそのオブジェクト上の IDispatch インターフェイスポインターを保持します。

戻り値

このメソッドは、標準的な戻り値に加えて、以下の値をサポートします。

詳細およびその他の戻り値については、ADSI エラーコードを参照してください。

解説(Remarks)

ディレクトリサービスのコレクションは、変更不可能なオブジェクトの集合で構成される場合もあります。

このメソッドは、ADSI システムプロバイダーのいずれでもサポートされていません。

vtbl 9 HRESULT Remove(LPWSTR bstrItemToBeRemoved)

IADsCollection::Remove メソッドは、名前付きの項目をこの ADSI コレクションオブジェクトから削除します。

bstrItemToBeRemovedLPWSTRinIADsCollection::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;
}
vtbl 10 HRESULT GetObject(LPWSTR bstrName, VARIANT* pvItem)

コレクションの項目を取得します。

bstrNameLPWSTRin項目の名前を指定する、null で終わる Unicode 文字列。これは、項目がコレクションに追加される際に IADsCollection::Add に渡されたものと同じ名前です。
pvItemVARIANT*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 の 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_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 不要)。