检索单个对象的属性

在应用程序检索对象标识符 (查看给定对象的 枚举内容 主题) 后,它可以通过调用 IPortableDeviceProperties 接口IPortableDeviceKeyCollection 接口中的方法来检索有关该对象的描述性信息。

IPortableDeviceProperties::GetValues 方法检索给定对象的指定属性列表。 (应用程序还可以调用 GetValues 方法并为 pKeys 参数指定 NULL 值,以检索给定对象的所有属性;但是,在检索所有属性时,此方法的性能可能会明显降低。)

但是,在应用程序调用 GetValues 之前,它需要通过在 IPortableDeviceKeyCollection 对象中设置相应的键来标识要检索的属性。 应用程序将通过调用 IPortableDeviceKeyCollection::Add 方法并提供用于标识它将检索的每个属性的 PROPERTYKEY 值来标识感兴趣的属性。

示例应用程序的 ContentProperties.cpp 模块中的 ReadContentProperties 函数演示了如何为所选对象检索五个属性。 下表描述了其中每个属性及其相应的 REFPROPERTYKEY 值。

属性 说明 PROPERTYKEY
父对象标识符 一个字符串,指定给定对象的父对象的标识符。 WPD_OBJECT_PARENT_ID
对象名称 一个指定给定对象的名称的字符串。 WPD_OBJECT_NAME
持久唯一标识符 一个字符串,指定给定对象的唯一标识符。 (此标识符在会话中是永久性的,与对象 identifier 不同。) WPD_OBJECT_PERSISTENT_UNIQUE_ID
对象格式 全局唯一标识符 (GUID) 指定与给定对象对应的文件格式。 WPD_OBJECT_FORMAT
对象内容类型 一个 GUID,指定与给定对象关联的内容类型。 WPD_OBJECT_CONTENT_TYPE

 

ReadContentProperties 函数的以下摘录演示了示例应用程序如何使用 IPortableDeviceKeyCollection 接口IPortableDeviceKeyCollection::Add 方法来标识它将检索的属性。

hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
                      NULL,
                      CLSCTX_INPROC_SERVER,
                      IID_PPV_ARGS(&pPropertiesToRead));
if (SUCCEEDED(hr))
{
    // 4) Populate the IPortableDeviceKeyCollection with the keys we wish to read.
    // NOTE: We are not handling any special error cases here so we can proceed with
    // adding as many of the target properties as we can.
    if (pPropertiesToRead != NULL)
    {
        HRESULT hrTemp = S_OK;
        hrTemp = pPropertiesToRead->Add(WPD_OBJECT_PARENT_ID);
        if (FAILED(hrTemp))
        {
            printf("! Failed to add WPD_OBJECT_PARENT_ID to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
        }

        hrTemp = pPropertiesToRead->Add(WPD_OBJECT_NAME);
        if (FAILED(hrTemp))
        {
            printf("! Failed to add WPD_OBJECT_NAME to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
        }

        hrTemp = pPropertiesToRead->Add(WPD_OBJECT_PERSISTENT_UNIQUE_ID);
        if (FAILED(hrTemp))
        {
            printf("! Failed to add WPD_OBJECT_PERSISTENT_UNIQUE_ID to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
        }

        hrTemp = pPropertiesToRead->Add(WPD_OBJECT_FORMAT);
        if (FAILED(hrTemp))
        {
            printf("! Failed to add WPD_OBJECT_FORMAT to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
        }

        hrTemp = pPropertiesToRead->Add(WPD_OBJECT_CONTENT_TYPE);
        if (FAILED(hrTemp))
        {
            printf("! Failed to add WPD_OBJECT_CONTENT_TYPE to IPortableDeviceKeyCollection, hr= 0x%lx\n", hrTemp);
        }
    }
}

示例应用程序设置适当的键后,调用 IPortableDeviceProperties::GetValues 方法来检索给定对象的指定值。

if (SUCCEEDED(hr))
{
    hr = pProperties->GetValues(szSelection,         // The object whose properties we are reading
                                pPropertiesToRead,   // The properties we want to read
                                &pObjectProperties); // Driver supplied property values for the specified object
    if (FAILED(hr))
    {
        printf("! Failed to get all properties for object '%ws', hr= 0x%lx\n", szSelection, hr);
    }
}

IPortableDevice 接口

IPortableDeviceKeyCollection 接口

IPortableDeviceProperties 接口

编程指南