Untersuchen eines Geräts

Das Untersuchen eines Geräts ähnelt dem Untersuchen eines Datenträgers. Alle Objekte auf einem Gerät werden als Speicher bezeichnet. Ein Speicher kann eine Datei, ein Ordner oder ein abstraktes Objekt (z. B. eine Wiedergabeliste) auf dem Gerät sein. Sie müssen die Attribute und Metadaten eines Speichers (falls unterstützt) untersuchen, um zu verstehen, um welche Art von Speicher es sich handelt. Speicher werden hierarchisch auf dem Gerät organisiert. Jeder Speicher verfügt über genau ein übergeordnetes Element, und alle Speicher stammen letztendlich von einem einzelnen Stammgerätespeicher ab, der in der Regel "\" genannt wird.

In den folgenden Schritten wird beschrieben, wie Sie ein Gerät erkunden:

  1. Rufen Sie die IWMDMDevice-Schnittstelle eines Geräts ab, wie unter Auflisten von Geräten beschrieben.
  2. Rufen Sie IWMDMDevice::EnumStorage auf, um eine IWMDMEnumStorage-Schnittstelle abzurufen. Diese Schnittstelle wird verwendet, um alle untergeordneten Objekte des Speichers abzurufen, der diese Schnittstelle zurückgibt. Wenn Sie diese Schnittstelle vom Gerät abrufen, wie wir es hier sind, enthält sie nur einen Speicher: den Speicher des Stammgeräts.
  3. Rufen Sie IWMDMEnumStorage::Next mit einer Anzahl von 1 auf, um die IWMDMStorage-Schnittstelle für den Stammspeicher des Geräts abzurufen. (Sie können nicht mehr als ein untergeordnetes Element vom Gerät anfordern.)
  4. Untersuchen Sie alle Speicher auf dem Gerät, indem Sie rekursiv IWMDMStorage::EnumStorage und dann IWMDMEnumStorage::Next aufrufen, um untergeordnete Elemente eines Speichers abzurufen. Um festzustellen, ob ein Speicher über untergeordnete Elemente verfügt, um die Aufrufe von EnumStorage und Next zu vermeiden, können Sie IWMDMStorage::GetAttributes aufrufen, um nach den Flags zu suchen, die WMDM_STORAGE_ATTR_HAS_FILES oder WMDM_STORAGE_ATTR_HAS_FOLDERS. Weitere Informationen zum Abrufen der Eigenschaften eines Speichers finden Sie unter Abrufen und Festlegen von Metadaten und Attributen undAbrufen und Festlegen von Metadaten und Attributen in der Anwendung.

Windows Media Geräte-Manager macht keinen Standardsatz von Ordnern verfügbar, um Medien eines bestimmten Typs zu speichern (z. B. einen Ordner "Meine Wiedergabelisten" für Wiedergabelisten). Jedes Gerät verfügt über ein eindeutiges Dateisystem, und Sie müssen sich für einen geeigneten Ort zum Suchen oder Senden einer bestimmten Datei entscheiden.

Hinweis

Windows Explorer können virtuelle Ordner anzeigen, die auf dem Gerät nicht vorhanden sind. Beispiel für virtuelle Ordner sind die Ordner "Media" und "Data", die für MTP-Geräte angezeigt werden. Diese Ordner werden von Windows erstellt, um Downloads für Endbenutzer zu vereinfachen. sie sind nicht tatsächlich auf dem Gerät vorhanden. Ihre Anwendung sollte nicht von der Suche nach diesen allgemeinen Ordnertypen abhängen. Umgekehrt zeigen Windows-Explorer möglicherweise nicht einige Ordner oder Objekte an, die auf dem Gerät vorhanden sind (z. B. Wiedergabelisten).

 

Der folgende C++-Beispielcode veranschaulicht die rekursive Untersuchung eines Geräts. Es werden zwei Funktionen verwendet:

  • ExploreDevice, eine Startfunktion, die einen Gerätezeiger empfängt und einen Zeiger auf den Stammenumerator für dieses Gerät abruft.
  • RecursiveExploreStorage, das aufgerufen wird, um ein Gerät rekursiv zu untersuchen.
// Get the root enumerator and start the recursive function.
HRESULT ExploreDevice(IWMDMDevice* pDevice)
{
    HRESULT hr = S_OK;

    // Get a root enumerator.
    CComPtr<IWMDMEnumStorage> pEnumStorage;
    hr = pDevice->EnumStorage(&pEnumStorage);
    if (SUCCEEDED(hr))
    {
        RecursiveExploreStorage(pEnumStorage);
    }
    return hr;
}

// Recursively explore a storage.
void RecursiveExploreStorage(IWMDMEnumStorage* pEnumStorage)
{
    HRESULT hr = S_OK;
    CComPtr<IWMDMStorage> pStorage;

    ULONG numRetrieved = 0;
    // Loop through all storages in the current storage.
    while((pEnumStorage->Next(1, &pStorage, &numRetrieved) == S_OK) && (numRetrieved == 1))
    {
        // Get the name of the object.
        const UINT MAX_LEN = 255;
        WCHAR name[MAX_LEN];
        hr = pStorage->GetName((LPWSTR)&name, MAX_LEN);
        // TODO: Display the retrieved storage name

        // If this is a folder, recurse into it.
        if (attributes & WMDM_FILE_ATTR_FOLDER)
        {
            CComPtr<IWMDMEnumStorage> pEnumSubStorage;
            hr = pStorage->EnumStorage(&pEnumSubStorage);
            if (SUCCEEDED(hr)
            {
                RecursiveExploreStorage(pEnumSubStorage);
            }
        }
        pStorage.Release();
    } // Get the next storage pointer.
    return;
}

Erstellen einer Windows Media Geräte-Manager-Anwendung