Метод 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 |