Freigeben über


Auflisten von Inhalten

Der Inhalt auf einem Gerät (unabhängig davon, ob es sich dabei um einen Ordner, ein Telefonbuch, ein Video oder ein Standbild handelt) wird in der WPD-API als Objekt bezeichnet. Auf diese Objekte wird durch Objektbezeichner verwiesen und durch Eigenschaften beschrieben. Sie können die Objekte auf einem Gerät aufzählen, 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 sich im Modul ContentEnumeration.cpp befindet. Diese Funktion wiederum ruft eine RecursiveEnumerate-Funktion auf, die die Hierarchie der auf dem ausgewählten Gerät gefundenen Objekte durchläuft und einen Objektbezeichner für jedes Objekt zurückgibt.

Wie bereits erwähnt, ruft die RecursiveEnumerate-Funktion einen Objektbezeichner für jedes Auf dem Gerät gefundene Objekt ab. Der Objektbezeichner ist ein Zeichenfolgenwert. Nachdem Ihre Anwendung diesen Bezeichner abgerufen hat, kann sie aussagekräftigere Objektinformationen (z. B. den Namen des Objekts, den Bezeichner für das übergeordnete Objekt usw.) abrufen. Diese beschreibenden Informationen werden als Objekteigenschaften (oder Metadaten) bezeichnet. Ihre Anwendung kann diese Eigenschaften abrufen, indem Mitglieder der IPortableDeviceProperties-Schnittstelle aufgerufen werden.

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 der auf dem angegebenen Gerät gefundenen Objekte durchläuft und für jedes Objekt einen Objektbezeichner zurückgibt.

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 Objekte zu navigieren, die auf einem bestimmten Gerät gefunden werden.

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

Jeder Aufruf der IEnumPortableDeviceObjects::Next-Methode fordert einen Batch mit 10 Bezeichnern an. (Dieser Wert wird durch die NUM_OBJECTS_TO_REQUEST Konstante angegeben, die als erstes Argument angegeben 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