Freigeben über


Auflisten von Geräten (WPD)

Die erste Aufgabe, die von den meisten Anwendungen ausgeführt wird, ist die Enumeration der Geräte, die mit dem Computer verbunden sind. Diese Aufgabe und das Abrufen von Geräteinformationen (z. B. Hersteller, Anzeigename und Beschreibung) werden von der IPortableDeviceManager-Schnittstelle unterstützt.

Die EnumerateAllDevices-Funktion im DeviceEnumeration.cpp-Modul enthält Code, der den Abruf der Anzahl verbundener Geräte und nach dem Abrufen der Anzahl gerätespezifischer Informationen für jedes verbundene Gerät veranschaulicht.

Die EnumerateAllDevices-Funktion führt vier primäre Aufgaben aus:

  1. Erstellt das Portable Device Manager-Objekt.
  2. Ruft die Anzahl der verbundenen Geräte ab.
  3. Ruft Geräteinformationen (für die verbundenen Geräte) ab.
  4. Gibt den beim Abrufen der Geräteinformationen verwendeten Arbeitsspeicher frei.

Jede dieser vier Aufgaben wird in den folgenden Abschnitten ausführlicher beschrieben.

Der erste Schritt im Geräteenumerationsprozess ist die Erstellung eines portablen Geräte-Manager-Objekts. Dazu rufen Sie die CoCreateInstance-Funktion auf und übergeben den Klassenbezeichner (CLSID) für das Objekt, geben den Kontext an, in dem der Code ausgeführt wird, einen Verweisbezeichner für die IPortableDeviceManager-Schnittstelle an und geben dann eine Zeigervariable an, die den IPortableDeviceManager-Schnittstellenzeiger empfängt.

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

Nachdem Sie einen IPortableDeviceManager-Schnittstellenzeiger abgerufen haben , können Sie mit dem Aufrufen von Methoden für diese Schnittstelle beginnen. Die erste Methode, die in der EnumerateAllDevices-Funktion aufgerufen wird, ist IPortableDeviceManager::GetDevices. Wenn diese Methode aufgerufen wird, wobei das erste Argument auf NULL festgelegt ist, gibt sie die Anzahl der verbundenen Geräte zurück.

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

Nachdem Sie die Anzahl der verbundenen Geräte abgerufen haben, können Sie diesen Wert verwenden, um Geräteinformationen für jedes verbundene Gerät abzurufen. Dieser Prozess beginnt mit der Übergabe eines Arrays von Zeichenfolgenzeigern als erstes Argument und einer Anzahl der Elemente, die dieses Array als zweites Argument enthalten kann (diese Anzahl sollte mindestens der Anzahl der verfügbaren Geräte entsprechen).

Die von dieser Methode zurückgegebenen Zeichenfolgen sind die Plug & Play Namen der verbundenen Geräte. Diese Namen werden wiederum an andere Methoden auf der IPortableDeviceManager-Schnittstelle übergeben, um gerätespezifische Informationen wie den Anzeigenamen, den Herstellernamen und die Gerätebeschreibung abzurufen. (Diese Namen werden auch verwendet, um eine Verbindung mit dem Gerät zu öffnen, wenn eine Anwendung die IPortableDevice::Open-Methode aufruft .)

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

Nachdem Sie die Geräteinformationen abgerufen haben, müssen Sie den Speicher freigeben, der den Zeichenfolgen zugeordnet ist, auf die das Array von Zeichenfolgenzeigern verweist. Außerdem müssen Sie dieses Array löschen.

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

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

IPortableDeviceManager-Schnittstelle

Programmierhandbuch