IWMDMDevice::EnumStorage (deprecated)
This is preliminary documentation and subject to change.
This topic documents a feature of the Windows Media Device Manager SDK. We recommend that you migrate your application to use the Windows Portable Devices API. For more information, see the Windows Portable Devices SDK.
The EnumStorage method retrieves an IWMDMEnumStorage interface to enumerate the storages on a device.
Syntax
HRESULT EnumStorage(
IWMDMEnumStorage** ppEnumStorage
);
Parameters
ppEnumStorage
[out] Pointer to a pointer to an IWMDMEnumStorage interface to enumerate the storages on a device. This points to the root storage on the device. The caller is responsible for calling Release on the retrieved interface.
Return Values
The method returns an HRESULT. All the interface methods in Windows Media Device Manager can return any of the following classes of error codes:
- Standard COM error codes
- Windows error codes converted to HRESULT values
- Windows Media Device Manager error codes
For an extenstive list of possible error codes, see Error Codes.
Possible values include, but are not limited to, those in the following table.
Return code | Description |
S_OK | The method succeeded. |
E_INVALIDARG | The ppEnumStorage parameter is an invalid or NULL pointer. |
E_FAIL | An unspecified error occurred. |
E_OUTOFMEMORY | The storage enumerator object could not be created because not enough memory is available. |
Example Code
The following two C++ functions recursively explore a device. The first one is a kickoff function that obtains the IWMDMEnumStorage interface of the root device storage. It passes this to the second, recursive function that examines all the nested functions.
// 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);
// Explore the rest of the device recursively.
RecursiveExploreStorage(pEnumStorage);
HANDLE_HR(hr, "Got a root storage in ExploreDevice.","Couldn't get a root storage in ExploreDevice.");
e_Exit:
return;
}
// Recursive function to explore all storages on the device.
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. 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;
}
Requirements
Header: Defined in mswmdm.h.
Library: mssachlp.lib
See Also