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 错误代码
  • 转换为 HRESULT 值的 Windows 错误代码
  • 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
标头 mswmdm.h
Library Mssachlp.lib

另请参阅

浏览设备

IWMDMDevice::EnumStorage

IWMDMEnumStorage 接口