Исходный код
//---------------------------------------------------------
// Выводит список атрибутов для выбранного объекта.
//---------------------------------------------------------
// выбрать объект
CComPtr<ITDMSObject> pObject;
if (SelectObject(&pObject, pApp, NULL))
{
// получить атрибуты объекта
CComPtr<ITDMSAttributes> pAttrs;
CheckError(pObject->get_Attributes(&pAttrs));
printf("\n\n");
// вывести информацию о каждом атрибуте в коллекции
printf("%-20s %-5s %-20s %-5s %-20s\n", "Definition", "Type", "Description", "Empty", "Value");
long lCount;
CheckError(pAttrs->get_Count(&lCount));
for (long i = 0; i < lCount; i++)
{
CComPtr<ITDMSAttribute> pAttr;
VARIANT varItem;
varItem.vt = VT_I4;
varItem.lVal = i;
CheckError(pAttrs->get_Item(varItem, &pAttr));
TDMSDataType type;
BSTR bsAttrDefName, bsDescription;
VARIANT_BOOL bEmpty;
VARIANT varValue;
CheckError(pAttr->get_AttributeDefName(&bsAttrDefName));
CheckError(pAttr->get_Type(&type));
CheckError(pAttr->get_Description(&bsDescription));
CheckError(pAttr->get_Empty(&bEmpty));
PCSTR csValue = "";
if (!bEmpty) {
CheckError(pAttr->get_Value(&varValue));
if (varValue.vt == VT_BSTR || VariantChangeType (&varValue, &varValue, 0, VT_BSTR) == S_OK)
csValue = W2A(varValue.bstrVal);
VariantClear(&varValue);
}
printf("%-20s %-5d %-20s %-5s %-20s\n", CSW2A(bsAttrDefName), type, CSW2A(bsDescription), bEmpty ? "Yes" : "No", csValue);
SysFreeString(bsAttrDefName);
SysFreeString(bsDescription);
}
}