Condividi tramite


Enumerazione dei dispositivi (WPD)

La prima attività completata dalla maggior parte delle applicazioni è l'enumerazione dei dispositivi connessi al computer. Questa attività e il recupero delle informazioni sul dispositivo (ad esempio produttore, nome descrittivo e descrizione) è supportato dall'interfaccia IPortableDeviceManager .

La funzione EnumerateAllDevices nel modulo DeviceEnumeration.cpp contiene codice che illustra il recupero del conteggio dei dispositivi connessi e, una volta recuperato il conteggio, il recupero di informazioni specifiche del dispositivo per ogni dispositivo connesso.

La funzione EnumerateAllDevices esegue quattro attività principali:

  1. Crea l'oggetto di gestione dispositivi portabile.
  2. Recupera un conteggio dei dispositivi connessi.
  3. Recupera le informazioni sul dispositivo (per i dispositivi connessi).
  4. Libera la memoria usata durante il recupero delle informazioni sul dispositivo.

Ognuna di queste quattro attività è descritta in modo più dettagliato nelle sezioni seguenti.

Il primo passaggio del processo di enumerazione del dispositivo è la creazione di un oggetto di gestione dispositivi portabile. Questa operazione viene eseguita chiamando la funzione CoCreateInstance e passando l'identificatore di classe (CLSID) per l'oggetto, specificando il contesto in cui verrà eseguito il codice, specificando un identificatore di riferimento per l'interfaccia IPortableDeviceManager e quindi fornendo una variabile puntatore che riceve il puntatore dell'interfaccia IPortableDeviceManager.

HRESULT hr = CoCreateInstance(CLSID_PortableDeviceManager,
                              NULL,
                              CLSCTX_INPROC_SERVER,
                              IID_PPV_ARGS(&pPortableDeviceManager));
if (FAILED(hr))
{
    printf("! Failed to CoCreateInstance CLSID_PortableDeviceManager, hr = 0x%lx\n",hr);
}

Dopo aver ottenuto un puntatore all'interfaccia IPortableDeviceManager , è possibile iniziare a chiamare i metodi in questa interfaccia. Il primo metodo chiamato nella funzione EnumerateAllDevices è IPortableDeviceManager::GetDevices. Quando questo metodo viene chiamato con il primo argomento impostato su NULL, restituisce il conteggio dei dispositivi connessi.

if (SUCCEEDED(hr))
{
    hr = pPortableDeviceManager->GetDevices(NULL, &cPnPDeviceIDs);
    if (FAILED(hr))
    {
        printf("! Failed to get number of devices on the system, hr = 0x%lx\n",hr);
    }
}

// Report the number of devices found.  NOTE: we will report 0, if an error
// occured.

printf("\n%d Windows Portable Device(s) found on the system\n\n", cPnPDeviceIDs);

Dopo aver recuperato il numero di dispositivi connessi, è possibile usare questo valore per recuperare le informazioni sul dispositivo per ogni dispositivo connesso. Questo processo inizia passando una matrice di puntatori di stringa come primo argomento e un conteggio del numero di elementi che questa matrice può contenere come secondo argomento (questo conteggio deve essere almeno uguale al numero di dispositivi disponibili).

Le stringhe restituite da questo metodo sono i nomi Plug and Play dei dispositivi connessi. Questi nomi, a sua volta, vengono passati ad altri metodi nell'interfaccia IPortableDeviceManager per recuperare informazioni specifiche del dispositivo, ad esempio il nome descrittivo, il nome del produttore e la descrizione del dispositivo. Questi nomi vengono usati anche per aprire una connessione al dispositivo quando un'applicazione chiama il metodo IPortableDevice::Open .

if (SUCCEEDED(hr) && (cPnPDeviceIDs > 0))
{
    pPnpDeviceIDs = new (std::nothrow) PWSTR[cPnPDeviceIDs];
    if (pPnpDeviceIDs != NULL)
    {
        DWORD dwIndex = 0;

        hr = pPortableDeviceManager->GetDevices(pPnpDeviceIDs, &cPnPDeviceIDs);
        if (SUCCEEDED(hr))
        {
            // For each device found, display the devices friendly name,
            // manufacturer, and description strings.
            for (dwIndex = 0; dwIndex < cPnPDeviceIDs; dwIndex++)
            {
                printf("[%d] ", dwIndex);
                DisplayFriendlyName(pPortableDeviceManager, pPnpDeviceIDs[dwIndex]);
                printf("    ");
                DisplayManufacturer(pPortableDeviceManager, pPnpDeviceIDs[dwIndex]);
                printf("    ");
                DisplayDescription(pPortableDeviceManager, pPnpDeviceIDs[dwIndex]);
            }
        }
        else
        {
            printf("! Failed to get the device list from the system, hr = 0x%lx\n",hr);
        }

Dopo aver recuperato le informazioni sul dispositivo, sarà necessario liberare la memoria associata alle stringhe a cui punta la matrice di puntatori di stringa. Sarà anche necessario eliminare questa matrice.

for (dwIndex = 0; dwIndex < cPnPDeviceIDs; dwIndex++)
{
    CoTaskMemFree(pPnpDeviceIDs[dwIndex]);
    pPnpDeviceIDs[dwIndex] = NULL;
}

// Delete the array of PWSTR pointers
delete [] pPnpDeviceIDs;
pPnpDeviceIDs = NULL;

Interfaccia IPortableDeviceManager

Guida per programmatori