Abrufen der funktionalen Objektbezeichner für ein Gerät
Wie im Thema Abrufen der von einem Gerät unterstützten Funktionskategorien beschrieben, unterstützen Windows Portable Devices möglicherweise eine oder mehrere Funktionskategorien. Jede bestimmte Funktionskategorie kann mindestens ein funktionales Objekt unterstützen. Beispielsweise kann die Speicherkategorie drei funktionale Speicherobjekte unterstützen, von denen jedes durch eine eindeutige Bezeichnerzeichenfolge identifiziert wird. Das erste Speicherobjekt kann dann durch die Zeichenfolge "Storage1", das zweite durch die Zeichenfolge "Storage2" und das dritte durch die Zeichenfolge "Storage3" identifiziert werden.
Die ListFunctionalObjects-Funktion im Modul DeviceCapabilities.cpp veranschaulicht das Abrufen von Inhaltstypen für die Funktionskategorien, die von einem ausgewählten Gerät unterstützt werden.
Ihre Anwendung kann die von einem Gerät unterstützten Funktionskategorien mithilfe der in der folgenden Tabelle beschriebenen Schnittstellen abrufen.
| Schnittstelle | BESCHREIBUNG |
|---|---|
| IPortableDeviceCapabilities-Schnittstelle | Ermöglicht den Zugriff auf die Abrufmethoden der Funktionskategorie. |
| IPortableDevicePropVariantCollection-Schnittstelle | Wird zum Aufzählen und Speichern von Funktionskategoriedaten verwendet. |
Der In der ListFunctionalObjects-Funktion gefundene Code ist fast identisch mit dem Code in der ListFunctionalCategories-Funktion. (Weitere Informationen finden Sie im Thema Abrufen von funktionalen Kategorien, die von einem Gerät unterstützt werden.) Der einzige Unterschied ist der Aufruf der IPortableDeviceCapabilities::GetFunctionalObjects-Methode, die innerhalb der Schleife angezeigt wird, die die funktionalen Kategorien durchläuft.
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);
}
}