다음을 통해 공유


디바이스 탐색

디바이스 탐색은 디스크 드라이브를 탐색하는 것과 비슷합니다. 디바이스의 모든 개체를 스토리지라고 합니다. 스토리지는 디바이스의 파일, 폴더 또는 추상 개체(예: 재생 목록)일 수 있습니다. 스토리지의 특성 및 메타데이터(지원되는 경우)를 검사하여 스토리지의 종류를 이해해야 합니다. 스토리지는 디바이스에서 계층적으로 구성됩니다. 모든 스토리지에는 정확히 하나의 부모가 있으며, 모든 스토리지는 궁극적으로 단일 루트 디바이스 스토리지(일반적으로 "\")에서 내림차순입니다.

다음 단계에서는 디바이스를 탐색하는 방법을 설명합니다.

  1. 디바이스 열거에 설명된 대로 디바이스의 IWMDMDevice 인터페이스 를 가져옵니다.
  2. IWMDMDevice::EnumStorage를 호출하여 IWMDMEnumStorage 인터페이스를 검색합니다. 이 인터페이스는 이 인터페이스를 반환하는 스토리지의 모든 자식 개체를 가져오는 데 사용됩니다. 여기서와 같이 디바이스에서 이 인터페이스를 가져오는 경우 루트 디바이스 스토리지라는 하나의 스토리지만 보유합니다.
  3. 1의 수로 IWMDMEnumStorage::Next 를 호출하여 루트 디바이스 스토리지에 대한 IWMDMStorage 인터페이스를 검색합니다. (디바이스에서 둘 이상의 자식은 요청할 수 없습니다.)
  4. IWMDMStorage::EnumStorage를 재귀적으로 호출한 다음 IWMDMEnumStorage::Next를 호출하여 디바이스의 모든 스토리지를 검사하여 스토리지의 자식을 가져옵니다. 스토리지에 EnumStorageNext에 대한 호출을 방지하는 자식이 있는지 확인하려면 IWMDMStorage::GetAttributes를 호출하여 플래그 WMDM_STORAGE_ATTR_HAS_FILES 또는 WMDM_STORAGE_ATTR_HAS_FOLDERS 대한 검사 수 있습니다. 스토리지의 속성을 가져오는 방법에 대한 자세한 내용은 메타데이터 및 특성 가져오기 및 설정 및애플리케이션에서 메타데이터 및 특성 가져오기 및 설정을 참조하세요.

Windows Media 장치 관리자 특정 유형의 미디어를 보관할 표준 폴더 집합(예: 재생 목록의 경우 "내 재생 목록" 폴더)을 노출하지 않습니다. 모든 디바이스에는 고유한 파일 시스템이 있으며 특정 파일을 찾거나 보낼 적절한 위치를 결정해야 합니다.

참고

Windows Explorer 디바이스에 실제로 존재하지 않는 가상 폴더를 표시할 수 있습니다. 가상 폴더의 예로 MTP 디바이스에 대해 표시되는 "미디어" 및 "데이터" 폴더가 있습니다. 이러한 폴더는 최종 사용자가 더 간단하게 다운로드할 수 있도록 Windows에서 만듭니다. 디바이스에 실제로 존재하지 않습니다. 애플리케이션은 이러한 유형의 일반 폴더를 찾는 데 의존해서는 안 됩니다. 반대로 Windows Explorer 디바이스에 있는 일부 폴더 또는 개체(예: 재생 목록)를 표시하지 않을 수 있습니다.

 

다음 C++ 예제 코드는 디바이스의 재귀 탐색을 보여 줍니다. 다음 두 가지 함수를 사용합니다.

  • ExploreDevice는 디바이스 포인터를 수신하고 해당 디바이스의 루트 열거자에 대한 포인터를 가져오는 시작 함수입니다.
  • RecursiveExploreStorage는 디바이스를 재귀적으로 탐색하기 위해 호출됩니다.
// Get the root enumerator and start the recursive function.
HRESULT ExploreDevice(IWMDMDevice* pDevice)
{
    HRESULT hr = S_OK;

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

// Recursively explore a storage.
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.
        const UINT MAX_LEN = 255;
        WCHAR name[MAX_LEN];
        hr = pStorage->GetName((LPWSTR)&name, MAX_LEN);
        // TODO: Display the retrieved storage name

        // If this is a folder, recurse into it.
        if (attributes & WMDM_FILE_ATTR_FOLDER)
        {
            CComPtr<IWMDMEnumStorage> pEnumSubStorage;
            hr = pStorage->EnumStorage(&pEnumSubStorage);
            if (SUCCEEDED(hr)
            {
                RecursiveExploreStorage(pEnumSubStorage);
            }
        }
        pStorage.Release();
    } // Get the next storage pointer.
    return;
}

Windows Media 장치 관리자 애플리케이션 만들기