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

IADsPropertyList

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

公式ドキュメント

IADsPropertyList インターフェイスは、オブジェクトのプロパティキャッシュ内にあるプロパティエントリの一覧を変更、読み取り、更新するために使用します。

メソッド 9

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

vtbl 7 HRESULT get_PropertyCount(INT* plCount)
plCountINT*outプロパティリスト内のプロパティ数を受け取る出力ポインタ。
vtbl 8 HRESULT Next(VARIANT* pVariant)

IADsPropertyList::Next メソッドは、プロパティリスト内の次の項目を取得します。返される項目は Property Entry オブジェクトです。

pVariantVARIANT*outプロパティリスト内の次の項目の値が格納される、呼び出し元が割り当てた変数のアドレスです。戻り値 VT_DISPATCH は、IADsPropertyEntry インターフェイスを実装するオブジェクトへの IDispatch インターフェイスポインターを指します。

戻り値

このメソッドは、項目が取得された場合の S_OK を含む標準の HRESULT 値をサポートします。リスト内の最後の項目が返されるとき、返される戻り値は使用するプロバイダーによって異なります。リスト内の最後の項目が取得されたことを示すために、次のコードが使用されます。

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

解説(Remarks)

Next メソッドが返す値が不要になったら、VariantClear を使用して pVariant をクリアする必要があります。

次のコード例は、Next メソッドを使用してプロパティリストを順に走査する方法を示しています。

Dim propList As IADsPropertyList
Dim v as Variant
Dim propVal As IADsPropertyValue
 
On Error Resume Next
 
Set propList = GetObject("LDAP://dc01/DC=Fabrikam,DC=com")
 
propList.GetInfo
Set v = propList.Next()
While (Not (IsNull(v)) And Err.Number = 0)
    Set propEnty = v
    Debug.Print v.Name
    Debug.Print v.AdsType
    
    Set v = propList.Next    
Wend

次の C++ コード例は、IADsPropertyList::Next メソッドの操作方法を示しています。

////////////////////////////////////
// Function used to retrieve an entry using the 
// IADsPropertyList::Next method.
 
//     name: GetNextEntry
//    input: IADsPropertyList*
//   return: IADsPropertyEntry
//     uses: IADsPropertyList::Next
/////////////////////////////////////////////////////////
IADsPropertyEntry* GetNextEntry(IADsPropertyList* pList)
{
    VARIANT var;
    VariantInit(&var);
    IADsPropertyEntry *pEntry;

    if(!pList)
    {
        _tprintf("An error has occurred.");
        return NULL;
    }
 
    HRESULT hr = pList->Next(&var);
    hr = V_DISPATCH(&var)->QueryInterface(IID_IADsPropertyEntry,
                                         (void**)&pEntry);
    VariantClear(&var);
    return pEntry;
}
vtbl 9 HRESULT Skip(INT cElements)

プロパティリスト内で、現在のカーソル位置から数えて、指定した数の項目をスキップします。

cElementsINTinスキップする要素の数です。

戻り値

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

vtbl 10 HRESULT Reset()

リストを先頭の項目にリセットします。

戻り値

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

vtbl 11 HRESULT Item(VARIANT varIndex, VARIANT* pVariant)

IADsPropertyList::Item メソッドは、指定したプロパティ項目をリストから取得します。

varIndexVARIANTin取得するプロパティのインデックスまたは名前を格納する VARIANT です。
pVariantVARIANT*out呼び出し元が割り当てた VARIANT 変数のアドレスです。戻り時に、この VARIANT には、取得された属性に対応する IADsPropertyEntry インターフェイスを実装するオブジェクトへの IDispatch ポインターが格納されます。

戻り値

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

解説(Remarks)

Item メソッドが返す値が不要になったら、VariantClear を使用して pVariant をクリアする必要があります。

次のコード例は、Item メソッドを使用してすべてのエントリを列挙する方法を示しています。

Dim propList As IADsPropertyList
Dim propEntry As IADsPropertyEntry
Dim count As Long

On Error GoTo Cleanup
 
Set propList = GetObject("LDAP://dc02/DC=Fabrikam,DC=com")
 
propList.GetInfo
count = propList.PropertyCount
Debug.Print "No of Property Found: " & count
 
'==== Getting the property list item with Name ==================
Set propEntry = propList.Item("uSNCreated")
Debug.Print propEntry.Name
Debug.Print propEntry.ADsType
 
' to examine property entries by name and type 
For i = 0 To count - 1
    '==== Getting the property list item with Number =============
    Set propEntry = propList.Item(i)
    Debug.Print propEntry.Name
    Debug.Print propEntry.ADsType
Next

Cleanup:
    If (Err.Number<>0) Then
        MsgBox("An error has occurred. " & Err.Number)
    End If

    Set propList = Nothing
    Set propEntry = Nothing

次のコード例は、IADsPropertyList::Item メソッドを使用してコンピューターの Owner プロパティを取得する方法を示しています。GetPropertyCache 関数の詳細およびコード例については、IADsPropertyList を参照してください。

////////////////////////////////////////
// function:    PropertyItem
//    input:    PropertyList, 
//              name of the item
//   output:    Property entry
//     uses:    IADsPropertyList::Item
////////////////////////////////////////
IADsPropertyEntry *PropertyItem(
         IADsPropertyList *pList,
         LPWSTR item)
{
    IADsPropertyEntry *pEntry;
    VARIANT varEntry, varItem;

    if(!pList || !item)
    {
        _tprintf(TEXT("Invalid parameter..."));
        return NULL;
    }

    VariantInit(&varItem);
    VariantInit(&varEntry);
 
    // get a property entry
    V_BSTR(&varItem)= SysAllocString(item);
    V_VT(&varItem)=VT_BSTR;
    HRESULT hr = pList->Item(varItem ,&varEntry);
    hr = V_DISPATCH(&var)->QueryInterface(
                        IID_IADsPropertyEntry,
                        (void**)&pEntry);
    VariantClear(&varItem);
    VariantClear(&varEntry);
    return pEntry;
}
 
///////////////////////////////////////
// examine a property entry
///////////////////////////////////////
IADsPropertyList *pList; pList=GetPropertyCache(L"WinNT://myComputer,computer");
 
IADsPropertyEntry *pEntry;
pEntry = PropertyItem(pList, L"Owner");

if(pEntry)
{
    HRESULT hr;
    BSTR bstr;
    long ln;

    hr = pEntry->get_Name(&bstr);
    if(SUCCEEDED(hr))
    {
        SysFreeString(bstr);
    }
    printf(" Name : %S\n", bstr);
 
    pEntry->get_ADsType(&ln);
    if(SUCCEEDED(hr))
    {
        printf(" Type : %d\n", ln);
    }
 
    pEntry->get_ControlCode(&ln); 
    if(SUCCEEDED(hr))
    {
        printf(" Code %d\n",ln);
    }
}
vtbl 12 HRESULT GetPropertyItem(LPWSTR bstrName, INT lnADsType, VARIANT* pVariant)

名前に一致する項目をリストから取得します。

bstrNameLPWSTRin要求するプロパティの名前を格納します。
lnADsTypeINTin要求するプロパティを解釈する際に使用するデータ型を決定する ADSTYPEENUM 列挙値のいずれかを格納します。型が不明な場合は、このパラメーターに ADSTYPE_UNKNOWN を設定できます。スキーマレスのサーバーの場合、ユーザーは型を指定する必要があります。
pVariantVARIANT*out

呼び出し元が割り当てた VARIANT 変数のアドレスです。戻り時に、この VARIANT には、取得された属性に対応する IADsPropertyEntry インターフェイスを実装するオブジェクトの IDispatch インターフェイスポインターが格納されます。

このパラメーターに割り当てられたメモリは、データが不要になったら VariantClear 関数で解放する必要があります。

戻り値

このメソッドは、S_OK を含む標準の HRESULT 戻り値をサポートします。要求したプロパティ項目が見つからない場合、このメソッドは ADS_PROPERTY_NOT_FOUND を返します。詳細およびその他の戻り値については、ADSI エラーコードを参照してください。

解説(Remarks)

このメソッドが返す IADsPropertyValue オブジェクトのうち使用できるプロパティは、lnADsType で指定した型によって異なります。次の表は、データ型を対応する IADsPropertyEntry プロパティに対応付けたものです。

lnADsType の値 使用する IADsPropertyValue プロパティ
ADSTYPE_INVALID 利用できません。
ADSTYPE_DN_STRING DNString
ADSTYPE_CASE_EXACT_STRING CaseExactString
ADSTYPE_CASE_IGNORE_STRING CaseIgnoreString
ADSTYPE_PRINTABLE_STRING PrintableString
ADSTYPE_NUMERIC_STRING NumericString
ADSTYPE_BOOLEAN Boolean
ADSTYPE_INTEGER Integer
ADSTYPE_OCTET_STRING OctetString
ADSTYPE_UTC_TIME UTCTime
ADSTYPE_LARGE_INTEGER LargeInteger
ADSTYPE_PROV_SPECIFIC IADsPropertyValue2::GetObjectProperty (VT_ARRAY | VT_UI1) を使用します。
ADSTYPE_OBJECT_CLASS 利用できません。
ADSTYPE_CASEIGNORE_LIST IADsPropertyValue2::GetObjectProperty (IADsCaseIgnoreList) を使用します。
ADSTYPE_OCTET_LIST IADsPropertyValue2::GetObjectProperty (IADsOctetList) を使用します。
ADSTYPE_PATH IADsPropertyValue2::GetObjectProperty (IADsPath) を使用します。
ADSTYPE_POSTALADDRESS IADsPropertyValue2::GetObjectProperty (IADsPostalAddress) を使用します。
ADSTYPE_TIMESTAMP IADsPropertyValue2::GetObjectProperty (IADsTimestamp) を使用します。
ADSTYPE_BACKLINK IADsPropertyValue2::GetObjectProperty (IADsBackLink) を使用します。
ADSTYPE_TYPEDNAME IADsPropertyValue2::GetObjectProperty (IADsTypedName) を使用します。
ADSTYPE_HOLD IADsPropertyValue2::GetObjectProperty (IADsHold) を使用します。
ADSTYPE_NETADDRESS IADsPropertyValue2::GetObjectProperty (IADsNetAddress) を使用します。
ADSTYPE_REPLICAPOINTER IADsPropertyValue2::GetObjectProperty (IADsReplicaPointer) を使用します。
ADSTYPE_FAXNUMBER IADsPropertyValue2::GetObjectProperty (IADsFaxNumber) を使用します。
ADSTYPE_EMAIL IADsPropertyValue2::GetObjectProperty (IADsEmail) を使用します。
ADSTYPE_NT_SECURITY_DESCRIPTOR SecurityDescriptor
ADSTYPE_UNKNOWN 利用できません。
ADSTYPE_DN_WITH_BINARY IADsPropertyValue2::GetObjectProperty (IADsDNWithBinary) を使用します。
ADSTYPE_DN_WITH_STRING IADsPropertyValue2::GetObjectProperty (IADsDNWithString) を使用します。
 

次のコード例は、GetPropertyItem メソッドを使用してプロパティエントリを取得する方法を示しています。

Const ADSTYPE_CASE_IGNORE_STRING = 3
Dim propList As IADsPropertyList
Dim propEntry As IADsPropertyEntry
Dim propVal As IADsPropertyValue

Set propList = GetObject("LDAP://dc01/DC=Fabrikam,DC=com")
propList.GetInfo
 
Set propEntry = propList.GetPropertyItem("dc", ADSTYPE_CASE_IGNORE_STRING)
 
For Each v In propEntry.Values
    Set propVal = v

    ' Use the CaseIgnoreString property because the ADSTYPE_CASE_IGNORE_STRING 
    ' type was requested in GetPropertyItem.
    Debug.Print propVal.CaseIgnoreString
Next

Set propList = Nothing
Set propEntry = Nothing
Set propVal = Nothing

次のコード例は、GetPropertyItem メソッドを使用してプロパティエントリを取得する方法を示しています。この例では、IADsPropertyList インターフェイスが適切に取得済みであることを前提としています。プロパティキャッシュの読み込み方法の詳細については、IADsPropertyList にある GetPropertyCache のサンプル関数を参照してください。

#include <activeds.h>
#include <stdio.h>
 
/////////////////////////////////////////////////////////
// Function to retrieve a specified property entry 
// using the IADsPropertyList::GetPropertyItem method.
/////////////////////////////////////////////////////////
IADsPropertyEntry *GetPropertyItem(
      IADsPropertyList *pList, 
      BSTR entryName,
      long entryType)
{
   IADsPropertyEntry *pEntry;
   VARIANT var;
   VariantInit(&var);

   if(!pList || !entryName)
   {
      _tprintf("Invalid argument...");
      return NULL;
   }
 
   // Get a property entry.
   hr = pList->GetPropertyItem(entryName, entryType, &var);
   hr = V_DISPATCH(&var)->QueryInterface(IID_IADsPropertyEntry,
                                         (void**)&pEntry);
   VariantClear(&var);
 
   return pEntry;
}
 
///////////////////////////////////////////////////////
// Examine a property entry.
///////////////////////////////////////////////////////
IADsPropertyList *pList = NULL;
IADsPropertyEntry *pEntry = NULL;

pList = GetPropertyCache(L"LDAP://dc01/DC=Fabrikam,DC=COM");
 
if(pList)
{
    pEntry = GetPropertyItem(pList, L"dc", ADSTYPE_CASE_IGNORE_STRING);
}

if(pEntry)
{ 
    BSTR nm;
    HRESULT hr = pEntry->get_Name(&nm);
    if(SUCCEEDED(hr))
    {
        printf("Property name = %S\n",nm);
        SysFreeString(nm);
    }
}
 
if(pList)
    pList->Release();
if(pEntry)
    pEntry->Release();
vtbl 13 HRESULT PutPropertyItem(VARIANT varData)

プロパティリスト内の項目の値を更新します。

varDataVARIANTinプロパティキャッシュに格納する新しいプロパティ値です。変更後のプロパティ値を保持する IADsPropertyEntry を実装するオブジェクトへの IDispatch ポインターを格納する必要があります。

戻り値

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

解説(Remarks)

IADsPropertyEntry::put_ControlCode には、適切な ADS_PROPERTY_OPERATION_ENUM 値を使用して、目的の変更 / 追加 / 削除操作を設定する必要があります。PutPropertyItem を呼び出した後、ディレクトリストアに変更を永続化するには IADs::SetInfo を呼び出す必要があります。プロパティ値は、IADs::SetInfo メソッドが呼び出されるまでコミットされません。

次のコード例は、PutPropertyItem を使用してプロパティリストに新しいエントリを追加する方法を示しています。

Dim propList As IADsPropertyList
Dim propVal As IADsPropertyValue
Dim propEntry As IADsPropertyEntry
On Error GoTo Cleanup

Set propList = GetObject("LDAP://DC=Fabrikam,DC=com")
Set propVal = New PropertyValue
 
'--- Property Value-----
propVal.CaseIgnoreString = "Fabrikam, Inc - Seattle, WA"
propVal.ADsType = ADSTYPE_CASE_IGNORE_STRING
 
'--- Property Entry ----
Set propEntry = New PropertyEntry
propEntry.Name = "adminDescription"
propEntry.Values = Array(propVal)
propEntry.ControlCode = ADS_PROPERTY_UPDATE
propEntry.ADsType = ADSTYPE_CASE_IGNORE_STRING
 
' --- Property List----
propList.PutPropertyItem (propEntry)
 
' query the IADs interface on the propList object
Dim IADsObj As IADs
Set IADsObj=propList
 
' Commit changes of the property list to the directory store.
IADsObj.SetInfo

Cleanup:
    If(Err.Number<>0) Then
        MsgBox("An error has occurred. " & Err.Number)
    End If

    Set propList = Nothing
    Set propVal = Nothing
    Set propEntry = Nothing
    Set IADsObj = Nothing

次のコード例は、IADsPropertyList::PutPropertyItem を使用してプロパティリストに新しいエントリを追加します。

// forward declaration of a helper function
HRESULT ADsBuildVarArrayDisp(IDispatch ** ppObjs,
                             DWORD      dwObjs,
                             VARIANT * pVar
                             )

int main()
{
   HRESULT hr = CoInitialize(NULL);

   IADsPropertyList *pList;
   hr = ADsOpenObject(L"LDAP://dc=Fabrikam,dc=com",
                      L"Administrator",
                      L"",
                      ADS_SECURE_AUTHENTICATION,
                      IID_IADsPropertyList,
                      (void**)&pList);

   if(hr!=S_OK)
   {
      _tprintf(TEXT("An error has occurred."));
      return;
   }

// create a property value object
   IADsPropertyValue *pVal;
   hr = CoCreateInstance(CLSID_PropertyValue,
                         NULL,
                         CLSCTX_INPROC_SERVER,
                         IID_IADsPropertyValue,
                         (void**)&pVal);
   if(hr!=S_OK)
   {
      _tprintf(TEXT("An error has occurred."));
      pList->Release();
      return;
   }

   hr = pVal->put_CaseIgnoreString(CComBSTR("Fabrikam, Inc - Seattle, WA"));

   hr = pVal->put_ADsType(ADSTYPE_CASE_IGNORE_STRING);

   // put the propertyValue object into a variant array for 
   // assignment to a propertyEntry object
   IDispatch *pDisp;
   hr = pVal->QueryInterface(IID_IDispatch,(void**)&pDisp);
   hr = pVal->Release();

   VARIANT vVals;
   VariantInit(&vVals);
   hr = ADsBuildVarArrayDisp(&pDisp,1,&vVals);  //code given below.
   pDisp->Release();  

   if(hr!=S_OK)
   {
      _tprintf(TEXT("An error has occurred."));
      pList->Release();
      return;
   }

   // Create a propertyEntry object
   IADsPropertyEntry *pEntry;
   hr = CoCreateInstance(CLSID_PropertyEntry,
                         NULL,
                         CLSCTX_INPROC_SERVER,
                         IID_IADsPropertyEntry,
                         (void**)&pEntry);

   hr = pEntry->put_Name(CComBSTR("adminDescription"));
   hr = pEntry->put_ControlCode(ADS_PROPERTY_UPDATE);
   hr = pEntry->put_ADsType(ADSTYPE_CASE_IGNORE_STRING);
   hr = pEntry->put_Values(vVals);
   VariantClear(&vVals);

   // Convert pEntry to pDisp for use in pList.PutPropertyItem
   hr = pEntry->QueryInterface(IID_IDispatch,(void**)&pDisp);
   pEntry->Release();

   VARIANT vEntry;
   VariantInit(&vEntry);
   V_DISPATCH(&vEntry)=pDisp;
   V_VT(&vEntry)=  VT_DISPATCH;
   hr = pList->PutPropertyItem(vEntry);  
   VariantClear(&vEntry);

   IADs *pObj;
   hr = pList->QueryInterface(IID_IADs,(void**)&pObj);
   pObj->SetInfo();
   pObj->Release();

   pList->Release();

   CoUninitialize();
   return 0;
}

////////////////
// Helper function to build a variant array of IDispatch objects.
///////////////
HRESULT ADsBuildVarArrayDisp(
    IDispatch ** ppObjs,
    DWORD      dwObjs,
    VARIANT * pVar
    )
{

    VARIANT v;
    SAFEARRAYBOUND sabNewArray;
    DWORD i;
    SAFEARRAY *psa = NULL;
    HRESULT hr = E_FAIL;

    if((!IDispatch) || (dwObjs<=0))
    {
        return E_INVALIDARG;
    }

    sabNewArray.cElements = dwObjs;
    sabNewArray.lLbound = 0;
    psa = SafeArrayCreate(VT_VARIANT, 1, &sabNewArray);

    if (!pVar) {
        hr = E_ADS_BAD_PARAMETER;
        goto Fail;
    }
    VariantInit(pVar);

    if (!psa) {
        goto Fail;
    }

    for (i = 0; i < dwObjs; i++) {
        VariantInit(&v);
        V_VT(&v) = VT_DISPATCH;
        V_DISPATCH(&v) = *(ppObjs + i);
        hr = SafeArrayPutElement(psa,
                                 (long FAR *)&i,
                                 &v
                                 );
        if (FAILED(hr))  {
            goto Fail;
        }
    }

    V_VT(pVar) = VT_VARIANT | VT_ARRAY;
    V_ARRAY(pVar) = psa;

    return(ResultFromScode(S_OK));

Fail:
    if (psa) {
        SafeArrayDestroy(psa);
    }

    return(E_FAIL);
}
vtbl 14 HRESULT ResetPropertyItem(VARIANT varEntry)

指定した項目をリスト、つまりキャッシュから削除します。

varEntryVARIANTinリセットするエントリです。

戻り値

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

解説(Remarks)

ResetPropertyItem はキャッシュの内容にのみ影響し、ディレクトリ内の実際のオブジェクトのプロパティには影響しません。つまり、ResetPropertyItem を呼び出した後に SetInfo を呼び出しても、ディレクトリオブジェクトのプロパティは削除されません。

次のコード例は、ResetPropertyItem の実装方法を示しています。

Dim propList As IADsPropertyList

On Error GoTo Cleanup
 
Set propList = GetObject("LDAP://DC=Fabrikam,DC=com")
 
'--- Now modify the cache using PutPropertyItem
Set propVal = New PropertyValue
'--- Property Value-----
propVal.CaseIgnoreString = "Fabrikam"
propVal.ADsType = ADSTYPE_CASE_IGNORE_STRING
 
'--- Property Entry ----
Set propEntry = New PropertyEntry
propEntry.Name = "adminDescription"
propEntry.Values = Array(propVal)
propEntry.ControlCode = ADS_PROPERTY_UPDATE
propEntry.ADsType = ADS_CASE_IGNORE_STRING
 
' --- Property List----
propList.PutPropertyItem (propEntry)
 
' Commit to the directory. Without this, the changes take place only in the cache.
propList.SetInfo 
 
propList.GetInfo
Debug.Print " Number of Properties = " & propList.PropertyCount
propList.ResetPropertyItem "adminDescription"
 
' the property count should have been reduced by one.
Debug.Print "Number of properties = " & propList.PropertyCount

Cleanup:
    If (Err.Number<>0) Then
        MsgBox("An error has occurred. " & Err.Number)
    End If
    Set propList = Nothing
    Set propVal = Nothing
    Set propEntry = Nothing

次のコード例は、IADsPropertyList::ResetPropertyItem の呼び出しによって生じる効果を示しています。GetPropertyCache 関数の詳細および一覧については、IADsPropertyList を参照してください。GetNextEntry 関数および PropertyItem 関数の詳細および一覧については、それぞれ IADsPropertyList::Next および IADsPropertyList::Item を参照してください。

IADsPropertyList *GetPropertyCache(LPWSTR);
IADsPropertyEntry *GetNextEntry(IADsPropertyList *);
IADsPropertyEntry *PropertyItem(IADsPropertyList *,LPWSTR);
 
void ResetItem(IADsPropertyList *pList, LPWSTR item)
{
    VARIANT var;
    VariantInit(&var);

    if(!pList)
    {
        item = NULL;
        return;
    }

    V_BSTR(&var)=SysAllocString(item);
    V_VT(&var)=VT_BSTR;
 
    pList->ResetPropertyItem(var);
    VariantClear(&var);
}
 
void TestResetItem()
{
    IADsPropertyEntry *pEntry = NULL;
    IADsPropertyList *pList = NULL;
    long count;
    BSTR bstr;
    HRESULT hr;
 
    pList = GetPropertyCache(L"WinNT://myComputer,computer");
 
    hr = pList->get_PropertyCount(&count);
    if(SUCCEEDED(hr))
    {
        printf(" Count before item reset : %d\n",count);
    }
 
    printf("Walking up the property list before item reset: \n");
    for (int i=0; i<count; i++)
    {
        pEntry = GetNextEntry(pList);
        hr = pEntry->get_Name(&bstr);
        if(SUCCEEDED(hr))
        {
            printf("   Name : %S\n",bstr);
            SysFreeString(bstr);
        }
    }
 
    pList->Reset();   // Move the cursor to the beginning of the list.
 
    ResetItem(pList, L"Owner");
 
    hr = pList->get_PropertyCount(&count);
    if(SUCCEEDED(hr))
    {
        printf(" Count after item reset : %d\n",count);
    }
 
    printf("Walking up the property list after item reset: \n");
 
    for (i=0; i<count; i++)
    {
        pEntry = GetNextEntry(pList);
        hr = pEntry->get_Name(&bstr);
        if(SUCCEEDED(hr))
        {
            printf("   Name : %S\n",bstr);
            SysFreeString(bstr);
        }
    }
 
    pEntry->Release();
    pList->Release();
}
vtbl 15 HRESULT PurgePropertyList()

プロパティリストからすべての項目を削除します。

戻り値

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

解説(Remarks)

PurgePropertyList メソッドを呼び出すと、すべての項目がキャッシュから削除されます。そのため、その後に GetPropertyItem を呼び出すとエラーが発生します。PurgePropertyList はキャッシュの内容にのみ影響し、ディレクトリ内の実際のオブジェクトのプロパティには影響しない点に注意してください。つまり、PurgePropertyList を呼び出した後に SetInfo を呼び出しても、ディレクトリオブジェクトのプロパティは削除されません。

次のコード例は、IADsPropertyList::PurgePropertyList の実装方法を示しています。

Dim propList As IADsPropertyList
 
On Error GoTo Cleanup

Set propList = GetObject("LDAP://dc03/DC=Fabrikam,DC=com")
propList.GetInfo
 
propList.PurgePropertyList
 
'- None of GetPropertyItem should work, because the list is purged.
'- The following line should generate error.
Set propEntry = propList.GetPropertyItem("adminDescription", ADSTYPE_CASE_IGNORE_STRING)

Cleanup:
    If (Err.Number<>0) Then
        MsgBox("An error has occurred. " & Err.Number)
    End If

    Set propList = Nothing

次のコード例は、IADsPropertyList::PurgePropertyList の呼び出しによって生じる効果を示しています。GetPropertyCache 関数の詳細およびコード例については、IADsPropertyList を参照してください。

IADsPropertyList *GetPropertyCache(LPWSTR);
 
void TestPurgePropertyList()
{
    IADsPropertyList *pList;
    pList=GetPropertyCache(L"WinNT://myComputer,computer");
 
    long count;

    if(pList)
    {
        pList->get_PropertyCount(&count);
        printf("Number of properties before purging: %d\n",count);
 
        count = -1;
        pList->PurgePropertyList();
        pList->get_PropertyCount(&count);
        printf("Number of properties after purging: %d\n",count);
    }
}
出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IADsPropertyList "{C6F602B6-8F69-11D0-8528-00C04FD8D503}"
#usecom global IADsPropertyList IID_IADsPropertyList "{}"
#comfunc global IADsPropertyList_get_PropertyCount  7 var
#comfunc global IADsPropertyList_Next               8 var
#comfunc global IADsPropertyList_Skip               9 int
#comfunc global IADsPropertyList_Reset              10
#comfunc global IADsPropertyList_Item               11 int,var
#comfunc global IADsPropertyList_GetPropertyItem    12 wstr,int,var
#comfunc global IADsPropertyList_PutPropertyItem    13 int
#comfunc global IADsPropertyList_ResetPropertyItem  14 int
#comfunc global IADsPropertyList_PurgePropertyList  15
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。