Auflisten von Inhalten

Der Inhalt eines Geräts (unabhängig davon, ob es sich um einen Ordner, ein Telefonbuch, ein Video oder ein Image handelt) wird in der WPD-API als Objekt bezeichnet. Auf diese Objekte wird von Objekt bezeichmern verwiesen, die von-Eigenschaften beschrieben werden. Sie können die Objekte auf einem Gerät auflisten, indem Sie Methoden in der iportabledevice-Schnittstelle, der iportabledevicecontent-SchnittStelle und der ienumportabledeviceobjectids-Schnittstelle aufrufen.

Die Beispielanwendung veranschaulicht die inhaltsenumeration in der enumerateallcontent-Funktion, die im Modul "contentenumeration. cpp" zu finden ist. Diese Funktion ruft wiederum eine rekursiveenumerate-Funktion auf, die die Hierarchie von Objekten durchläuft, die auf dem ausgewählten Gerät gefunden wurden, und gibt für jedes Objekt einen Objekt Bezeichner zurück.

Wie bereits erwähnt, ruft die recursiveenumerate-Funktion einen Objekt Bezeichner für jedes Objekt ab, das auf dem Gerät gefunden wurde. Der Objekt Bezeichner ist ein Zeichen folgen Wert. Nachdem Ihre Anwendung diesen Bezeichner abgerufen hat, kann er weitere beschreibende Objektinformationen abrufen (z. b. den Namen des Objekts, den Bezeichner für das übergeordnete Objekt des Objekts usw.). Diese beschreibenden Informationen werden als Objekteigenschaften (oder Metadaten) bezeichnet. Die Anwendung kann diese Eigenschaften abrufen, indem Sie Member der iportabledeviceproperties-Schnittstelleaufrufen.

Die enumerateallcontent-Funktion beginnt mit dem Abrufen eines Zeigers auf eine iportabledevicecontent-Schnittstelle. Dieser Zeiger wird durch Aufrufen der iportabledevice:: Content -Methode abgerufen.

void EnumerateAllContent(
    IPortableDevice* pDevice)
{
    HRESULT                         hr = S_OK;
    CComPtr<IPortableDeviceContent> pContent;

    if (pDevice == NULL)
    {
        printf("! A NULL IPortableDevice interface pointer was received\n");
        return;
    }

    // Get an IPortableDeviceContent interface from the IPortableDevice interface to
    // access the content-specific methods.
    hr = pDevice->Content(&pContent);
    if (FAILED(hr))
    {
        printf("! Failed to get IPortableDeviceContent from IPortableDevice, hr = 0x%lx\n",hr);
    }

    // Enumerate content starting from the "DEVICE" object.
    if (SUCCEEDED(hr))
    {
        printf("\n");
        RecursiveEnumerate(WPD_DEVICE_OBJECT_ID, pContent);
    }
}

Nachdem der Zeiger auf die iportabledevicecontent-Schnittstelle abgerufen wurde, ruft die enumerateallcontent-Funktion die recursiveenumerate-Funktion auf, die die Hierarchie von Objekten durchläuft, die auf dem angegebenen Gerät gefunden wurden, und gibt jeweils einen Objekt Bezeichner zurück.

Die recursiveenumerate-Funktion beginnt mit dem Abrufen eines Zeigers auf eine ienumportabledeviceobjectids-Schnittstelle. Diese Schnittstelle macht die Methoden verfügbar, die eine Anwendung verwendet, um in der Liste der auf einem bestimmten Gerät gefundenen Objekte zu navigieren.

In diesem Beispiel ruft die recursiveenumerate-Funktion die ienumportabledeviceobjectids:: Next -Methode auf, um die Liste der-Objekte zu durchlaufen.

Jeder Aufrufen der ienumportabledeviceobjects:: Next -Methode fordert einen Batch von 10 bezeichern an. (Dieser Wert wird durch den num _ angegeben. Objekte _ zum _ Anfordern einer Konstante, die als erstes Argument bereitgestellt wird.)

#define NUM_OBJECTS_TO_REQUEST  10

// Recursively called function which enumerates using the specified
// object identifier as the parent.
void RecursiveEnumerate(
    PCWSTR                  pszObjectID,
    IPortableDeviceContent* pContent)
{
    CComPtr<IEnumPortableDeviceObjectIDs> pEnumObjectIDs;

    // Print the object identifier being used as the parent during enumeration.
    printf("%ws\n",pszObjectID);

    // Get an IEnumPortableDeviceObjectIDs interface by calling EnumObjects with the
    // specified parent object identifier.
    HRESULT hr = pContent->EnumObjects(0,               // Flags are unused
                                       pszObjectID,     // Starting from the passed in object
                                       NULL,            // Filter is unused
                                       &pEnumObjectIDs);
    if (FAILED(hr))
    {
        printf("! Failed to get IEnumPortableDeviceObjectIDs from IPortableDeviceContent, hr = 0x%lx\n",hr);
    }

    // Loop calling Next() while S_OK is being returned.
    while(hr == S_OK)
    {
        DWORD  cFetched = 0;
        PWSTR  szObjectIDArray[NUM_OBJECTS_TO_REQUEST] = {0};
        hr = pEnumObjectIDs->Next(NUM_OBJECTS_TO_REQUEST,   // Number of objects to request on each NEXT call
                                  szObjectIDArray,          // Array of PWSTR array which will be populated on each NEXT call
                                  &cFetched);               // Number of objects written to the PWSTR array
        if (SUCCEEDED(hr))
        {
            // Traverse the results of the Next() operation and recursively enumerate
            // Remember to free all returned object identifiers using CoTaskMemFree()
            for (DWORD dwIndex = 0; dwIndex < cFetched; dwIndex++)
            {
                RecursiveEnumerate(szObjectIDArray[dwIndex],pContent);

                // Free allocated PWSTRs after the recursive enumeration call has completed.
                CoTaskMemFree(szObjectIDArray[dwIndex]);
                szObjectIDArray[dwIndex] = NULL;
            }
        }
    }
}

Ienumportabledeviceobjectids-Schnittstelle

Iportabledevice-Schnittstelle

Iportabledevicecontent-Schnittstelle

Iportabledeviceproperties-Schnittstelle

Programmierhandbuch