检索单个对象的属性
在应用程序检索对象标识符 (查看给定对象的 枚举内容 主题) 后,它可以通过调用 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);
}
}
相关主题