다음을 통해 공유


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++ 함수는 디바이스를 재귀적으로 탐색합니다. 첫 번째는 루트 디바이스 스토리지의 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
라이브러리 Mssachlp.lib

추가 정보

디바이스 탐색

IWMDMDevice::EnumStorage

IWMDMEnumStorage 인터페이스