Condividi tramite


Recupero degli identificatori di oggetto funzionale per un dispositivo

Come indicato nell'argomento Recupero delle categorie funzionali supportate da un dispositivo, Windows i dispositivi portatili possono supportare una o più categorie funzionali. Qualsiasi categoria funzionale specificata può supportare uno o più oggetti funzionali. Ad esempio, la categoria di archiviazione può supportare tre oggetti di archiviazione funzionali, ognuno dei quali è identificato da una stringa di identificatore univoco. Il primo oggetto di archiviazione può quindi essere identificato dalla stringa "Storage1", dal secondo dalla stringa "Storage2" e dal terzo dalla stringa "Storage3".

La funzione ListFunctionalObjects nel modulo DeviceCapabilities.cpp illustra il recupero dei tipi di contenuto per le categorie funzionali supportate da un dispositivo selezionato.

L'applicazione può recuperare le categorie funzionali supportate da un dispositivo usando le interfacce descritte nella tabella seguente.

Interfaccia Descrizione
Interfaccia IPortableDeviceCapabilities Fornisce l'accesso ai metodi di recupero delle categorie funzionali.
Interfaccia IPortableDevicePropVariantCollection Usato per enumerare e archiviare i dati di categoria funzionale.

 

Il codice trovato nella funzione ListFunctionalObjects è quasi identico al codice trovato nella funzione ListFunctionalCategories. Vedere l'argomento Recupero di categorie funzionali supportate da un dispositivo . La differenza è la chiamata al metodo IPortableDeviceCapabilities::GetFunctionalObjects , che viene visualizzato all'interno del ciclo che scorre le categorie funzionali.

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);
    }
}

Interfaccia IPortableDevice

Interfaccia IPortableDeviceCapabilities

Interfaccia IPortableDevicePropVariantCollection

Guida alla programmazione