Получение идентификаторов функциональных объектов для устройства
Как отмечалось в разделе "Получение функциональных категорий", поддерживаемых разделом "Устройства", Windows переносимые устройства могут поддерживать одну или несколько функциональных категорий. Любая функциональная категория может поддерживать один или несколько функциональных объектов. Например, категория хранилища может поддерживать три функциональных объекта хранилища, каждый из которых идентифицируется по строке уникального идентификатора. Затем первый объект хранилища может быть идентифицирован строкой Storage1, второй строкой Storage2, а третий — строкой Storage3.
Функция ListFunctionalObjects в модуле DeviceCapabilities.cpp демонстрирует получение типов контента для функциональных категорий, поддерживаемых выбранным устройством.
Приложение может получить функциональные категории, поддерживаемые устройством, с помощью интерфейсов, описанных в следующей таблице.
Интерфейс | Описание |
---|---|
Интерфейс IPortableDeviceCapabilities | Предоставляет доступ к методам извлечения функциональной категории. |
Интерфейс IPortableDevicePropVariantCollection | Используется для перечисления и хранения данных функциональной категории. |
Код, найденный в функции ListFunctionalObjects, почти идентичен коду, найденного в функции ListFunctionalCategories. (См. раздел о получении функциональных категорий, поддерживаемых разделом устройства .) Одним из различий является вызов метода IPortableDeviceCapabilities::GetFunctionalObjects , который отображается в цикле, который выполняет итерацию по функциональным категориям.
HRESULT hr = S_OK;
CComPtr<IPortableDeviceCapabilities> pCapabilities;
CComPtr<IPortableDevicePropVariantCollection> pCategories;
DWORD dwNumCategories = 0;
if (pDevice == NULL)
{
printf("! A NULL IPortableDevice interface pointer was received\n");
return;
}
// Get an IPortableDeviceCapabilities interface from the IPortableDevice interface to
// access the device capabilities-specific methods.
hr = pDevice->Capabilities(&pCapabilities);
if (FAILED(hr))
{
printf("! Failed to get IPortableDeviceCapabilities from IPortableDevice, hr = 0x%lx\n",hr);
}
// Get all functional categories supported by the device.
// We will use these categories to enumerate functional objects
// that fall within them.
if (SUCCEEDED(hr))
{
hr = pCapabilities->GetFunctionalCategories(&pCategories);
if (FAILED(hr))
{
printf("! Failed to get functional categories from the device, hr = 0x%lx\n",hr);
}
}
// Get the number of functional categories found on the device.
if (SUCCEEDED(hr))
{
hr = pCategories->GetCount(&dwNumCategories);
if (FAILED(hr))
{
printf("! Failed to get number of functional categories, hr = 0x%lx\n",hr);
}
}
printf("\n%d Functional Categories Found on the device\n\n", dwNumCategories);
// Loop through each functional category and get the list of
// functional object identifiers associated with a particular
// category.
if (SUCCEEDED(hr))
{
for (DWORD dwIndex = 0; dwIndex < dwNumCategories; dwIndex++)
{
PROPVARIANT pv = {0};
PropVariantInit(&pv);
hr = pCategories->GetAt(dwIndex, &pv);
if (SUCCEEDED(hr))
{
// We have a functional category. It is assumed that
// functional categories are returned as VT_CLSID
// VarTypes.
if ((pv.puuid != NULL) &&
(pv.vt == VT_CLSID))
{
// Display the functional category name
printf("Functional Category: ");
DisplayFunctionalCategory(*pv.puuid);
printf("\n");
// Display the object identifiers for all
// functional objects within this category
CComPtr<IPortableDevicePropVariantCollection> pFunctionalObjectIds;
hr = pCapabilities->GetFunctionalObjects(*pv.puuid, &pFunctionalObjectIds);
if (SUCCEEDED(hr))
{
printf("Functional Objects: ");
DisplayFunctionalObjectIDs(pFunctionalObjectIds);
printf("\n\n");
}
else
{
printf("! Failed to get functional objects, hr = 0x%lx\n", hr);
}
}
else
{
printf("! Invalid functional category found\n");
}
}
PropVariantClear(&pv);
}
}
Связанные темы