IADsPropertyList
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
IADsPropertyList インターフェイスは、オブジェクトのプロパティキャッシュ内にあるプロパティエントリの一覧を変更、読み取り、更新するために使用します。
メソッド 9
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
| plCount | INT* | out | プロパティリスト内のプロパティ数を受け取る出力ポインタ。 |
IADsPropertyList::Next メソッドは、プロパティリスト内の次の項目を取得します。返される項目は Property Entry オブジェクトです。
| pVariant | VARIANT* | 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;
}
プロパティリスト内で、現在のカーソル位置から数えて、指定した数の項目をスキップします。
| cElements | INT | in | スキップする要素の数です。 |
戻り値
このメソッドは、S_OK を含む標準の HRESULT 戻り値をサポートします。詳細およびその他の戻り値については、ADSI エラーコードを参照してください。
リストを先頭の項目にリセットします。
戻り値
このメソッドは、S_OK を含む標準の HRESULT 戻り値をサポートします。詳細およびその他の戻り値については、ADSI エラーコードを参照してください。
IADsPropertyList::Item メソッドは、指定したプロパティ項目をリストから取得します。
| varIndex | VARIANT | in | 取得するプロパティのインデックスまたは名前を格納する VARIANT です。 |
| pVariant | VARIANT* | 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);
}
}
名前に一致する項目をリストから取得します。
| bstrName | LPWSTR | in | 要求するプロパティの名前を格納します。 |
| lnADsType | INT | in | 要求するプロパティを解釈する際に使用するデータ型を決定する ADSTYPEENUM 列挙値のいずれかを格納します。型が不明な場合は、このパラメーターに ADSTYPE_UNKNOWN を設定できます。スキーマレスのサーバーの場合、ユーザーは型を指定する必要があります。 |
| pVariant | VARIANT* | out | 呼び出し元が割り当てた VARIANT 変数のアドレスです。戻り時に、この VARIANT には、取得された属性に対応する IADsPropertyEntry インターフェイスを実装するオブジェクトの IDispatch インターフェイスポインターが格納されます。 このパラメーターに割り当てられたメモリは、データが不要になったら VariantClear 関数で解放する必要があります。 |
戻り値
このメソッドは、S_OK を含む標準の HRESULT 戻り値をサポートします。要求したプロパティ項目が見つからない場合、このメソッドは ADS_PROPERTY_NOT_FOUND を返します。詳細およびその他の戻り値については、ADSI エラーコードを参照してください。
解説(Remarks)
このメソッドが返す IADsPropertyValue オブジェクトのうち使用できるプロパティは、lnADsType で指定した型によって異なります。次の表は、データ型を対応する IADsPropertyEntry プロパティに対応付けたものです。
例
次のコード例は、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();
プロパティリスト内の項目の値を更新します。
| varData | VARIANT | in | プロパティキャッシュに格納する新しいプロパティ値です。変更後のプロパティ値を保持する 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);
}
指定した項目をリスト、つまりキャッシュから削除します。
| varEntry | VARIANT | in | リセットするエントリです。 |
戻り値
このメソッドは、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();
}
プロパティリストからすべての項目を削除します。
戻り値
このメソッドは、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 公式リファレンス: 英語 (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 不要)。#define global IID_IADsPropertyList "{C6F602B6-8F69-11D0-8528-00C04FD8D503}" #usecom global IADsPropertyList IID_IADsPropertyList "{}" #comfunc global IADsPropertyList_get_PropertyCount 7 sptr #comfunc global IADsPropertyList_Next 8 sptr #comfunc global IADsPropertyList_Skip 9 int #comfunc global IADsPropertyList_Reset 10 #comfunc global IADsPropertyList_Item 11 int,sptr #comfunc global IADsPropertyList_GetPropertyItem 12 wstr,int,sptr #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が無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。