Énumération d’appareils (WPD)
La première tâche effectuée par la plupart des applications est l’énumération des appareils connectés à l’ordinateur. Cette tâche et la récupération d’informations sur l’appareil (telles que le fabricant, le nom convivial et la description) sont prises en charge par l’interface IPortableDeviceManager .
La fonction EnumerateAllDevices dans le module DeviceEnumeration.cpp contient du code qui illustre la récupération du nombre d’appareils connectés et, une fois le nombre récupéré, la récupération d’informations spécifiques à l’appareil pour chaque appareil connecté.
La fonction EnumerateAllDevices accomplit quatre tâches principales :
- Crée l’objet gestionnaire de périphériques portable.
- Récupère un nombre d’appareils connectés.
- Récupère les informations sur l’appareil (pour les appareils connectés).
- Libère la mémoire utilisée lors de la récupération des informations de l’appareil.
Chacune de ces quatre tâches est décrite plus en détail dans les sections suivantes.
La première étape du processus d’énumération d’appareil est la création d’un objet gestionnaire de périphériques portable. Pour ce faire, appelez la fonction CoCreateInstance et transmettez l’identificateur de classe (CLSID) de l’objet, en spécifiant le contexte dans lequel le code s’exécutera, en spécifiant un identificateur de référence pour l’interface IPortableDeviceManager, puis en fournissant une variable de pointeur qui reçoit le pointeur d’interface 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);
}
Une fois que vous avez obtenu un pointeur d’interface IPortableDeviceManager , vous pouvez commencer à appeler des méthodes sur cette interface. La première méthode appelée dans la fonction EnumerateAllDevices est IPortableDeviceManager::GetDevices. Lorsque cette méthode est appelée avec le premier argument défini sur NULL, elle retourne le nombre d’appareils connectés.
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);
Une fois que vous avez récupéré le nombre d’appareils connectés, vous pouvez utiliser cette valeur pour récupérer les informations de l’appareil pour chaque appareil connecté. Ce processus commence par passer un tableau de pointeurs de chaîne comme premier argument et un nombre d’éléments que ce tableau peut contenir comme deuxième argument (ce nombre doit être au moins égal au nombre d’appareils disponibles).
Les chaînes retournées par cette méthode sont les noms Plug-and-Play des appareils connectés. Ces noms, à leur tour, sont passés à d’autres méthodes de l’interface IPortableDeviceManager pour récupérer des informations spécifiques à l’appareil, telles que le nom convivial, le nom du fabricant et la description de l’appareil. (Ces noms sont également utilisés pour ouvrir une connexion à l’appareil lorsqu’une application appelle la méthode 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);
}
Une fois que vous avez récupéré les informations sur l’appareil, vous devez libérer la mémoire associée aux chaînes pointées par le tableau de pointeurs de chaîne. Vous devrez également supprimer ce tableau.
for (dwIndex = 0; dwIndex < cPnPDeviceIDs; dwIndex++)
{
CoTaskMemFree(pPnpDeviceIDs[dwIndex]);
pPnpDeviceIDs[dwIndex] = NULL;
}
// Delete the array of PWSTR pointers
delete [] pPnpDeviceIDs;
pPnpDeviceIDs = NULL;
Rubriques connexes