Поделиться через


Метод IWMDMEnumStorage::Next (mswmdm.h)

Метод Next извлекает указатель на следующее одноуровневое хранилище.

Синтаксис

HRESULT Next(
  [in]  ULONG        celt,
  [out] IWMDMStorage **ppStorage,
  [out] ULONG        *pceltFetched
);

Параметры

[in] celt

Количество запрошенных хранилищ.

[out] ppStorage

Указатель на выделенный вызывающим массив указателей интерфейса IWMDMStorage . Размер этого массива должен быть IWMDMStorage *[celt]. Вызывающий объект должен освободить эти интерфейсы по завершении работы с ними. Чтобы избежать выделения всего массива, просто передайте адрес указателя на интерфейс IWMDMStorage , как показано в разделе Примечания.

[out] pceltFetched

Количество перечисленных хранилищ.

Возвращаемое значение

Метод возвращает HRESULT. Все методы интерфейса в Windows Media диспетчер устройств могут возвращать любой из следующих классов кодов ошибок:

  • Стандартные коды ошибок COM
  • Коды ошибок Windows, преобразованные в значения HRESULT
  • Коды ошибок диспетчер устройств Windows Media
Подробный список возможных кодов ошибок см. в разделе Коды ошибок.

Комментарии

Windows Media диспетчер устройств делегирует перечисление хранилища соответствующему поставщику услуг. Сведения о перечислении хранилища поставщика услуг см. в интерфейсе IMDSPEnumStorage .

Перечислитель хранилища может не отражать эффект вставки и удаления мультимедиа. В этом случае приложение должно получить новый объект перечислителя хранилища, вызвав IWMDMDevice::EnumStorage , чтобы получить обновленный список. Если требуется получить только один интерфейс за раз, не нужно выделять массив для этого метода, как показано в следующем коде.

Примеры

Следующие две функции C++ рекурсивно исследуют устройство. Первый — это функция kickoff, которая получает интерфейс IWMDMEnumStorage корневого хранилища устройства. Он передает его рекурсивной функции, которая проверяет все вложенные функции.


// Kickoff function to explore a device.
void ExploreDevice(IWMDMDevice* pDevice)
{
    HRESULT hr = S_OK;

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

    HANDLE_HR(hr, "Got a root storage in ExploreDevice.","Couldn't get a root storage in ExploreDevice.");

e_Exit:
    return;
}

void RecursiveExploreStorage(IWMDMEnumStorage* pEnumStorage)
{
    HRESULT hr = S_OK;
    CComPtr<IWMDMStorage> pStorage;
    ULONG numRetrieved = 0;
    // Loop through all storages in the current storage.
    // We don't need to allocate an array to retrieve one 
    // interface at a time.
    while(pEnumStorage->Next(1, &pStorage, &numRetrieved) == S_OK && numRetrieved == 1)
    {
        // Get the name of the object. The first time this is called on a 
        // device, it will retrieve '\' as the root folder name.
        const UINT MAX_LEN = 255;
        WCHAR name[MAX_LEN];
        hr = pStorage->GetName((LPWSTR)&name, MAX_LEN);
        // TODO: Display the storage name.

    
        // Get metadata for the storage.
        if (SUCCEEDED(hr))
            GetMetadata(pStorage);

        // Find out something about the item.
        DWORD attributes = 0;
        _WAVEFORMATEX audioFormat;
        hr = pStorage->GetAttributes(&attributes, &audioFormat);
        HANDLE_HR(hr, "Got storage attributes in RecursivelyExploreStorage.","Couldn't get storage attributes in RecursivelyExploreStorage.");

        // If this is a folder, recurse into it.
        if (attributes & WMDM_FILE_ATTR_FILE)
            // TODO: Display a message indicating that this is a file.
        if (attributes & WMDM_FILE_ATTR_FOLDER)
        {
            // TODO: Display a message indicating that this is a folder.
            CComPtr<IWMDMEnumStorage> pEnumSubStorage;
            hr = pStorage->EnumStorage(&pEnumSubStorage);
            RecursiveExploreStorage(pEnumSubStorage);
        }

        // Some other useful attributes to check include:
        // WMDM_FILE_ATTR_CANDELETE and WMDM_FILE_ATTR_CANPLAY and others to determine what can be done with a storage.
        // WMDM_FILE_ATTR_HIDDEN and other attributes to determine display characteristics,
        // WMDM_STORAGE_IS_DEFAULT to see if this is the default save location for new files.
        pStorage.Release();
    } // Get the next storage pointer.

e_Exit:
    return;
}

Требования

Требование Значение
Целевая платформа Windows
Header mswmdm.h
Библиотека Mssachlp.lib

См. также раздел

Изучение устройства

IWMDMDevice::EnumStorage

Интерфейс IWMDMEnumStorage