デバイスの探索
デバイスの探索は、ディスク ドライブの探索に似ています。 デバイス上のすべてのオブジェクトは ストレージと呼ばれます。 ストレージには、デバイス上のファイル、フォルダー、または抽象オブジェクト (プレイリストなど) を指定できます。 ストレージの属性とメタデータ (サポートされている場合) を調べて、ストレージの種類を理解する必要があります。 ストレージは、デバイス上で階層的に整理されます。すべてのストレージには親が 1 つだけあり、すべてのストレージは最終的に単一のルート デバイス ストレージ (通常は "\" という名前) から派生します。
次の手順では、デバイスを探索する方法について説明します。
- デバイスの列挙に関するページの説明に従って、デバイスの IWMDMDevice インターフェイス を取得します。
- IWMDMDevice::EnumStorage を呼び出して、IWMDMEnumStorage インターフェイスを取得します。 このインターフェイスは、このインターフェイスを返すストレージのすべての子オブジェクトを取得するために使用されます。 デバイスからこのインターフェイスを取得する場合、ここにあるように、ルート デバイス ストレージという 1 つのストレージのみが保持されます。
- ルート デバイス ストレージの IWMDMStorage インターフェイスを取得するには、カウントが 1 の IWMDMEnumStorage ::Next を呼び出します。 (デバイスに複数の子を要求することはできません)。
- IWMDMStorage::EnumStorage を再帰的に呼び出し、IWMDMEnumStorage::Next を呼び出してデバイス上のすべてのストレージを調べて、ストレージの子を取得します。 EnumStorage と Next の呼び出しを回避するためにストレージに子があるかどうかを確認するには、IWMDMStorage::GetAttributes を呼び出して、フラグのWMDM_STORAGE_ATTR_HAS_FILESまたはWMDM_STORAGE_ATTR_HAS_FOLDERSをチェックできます。 ストレージのプロパティを取得する方法の詳細については、「 メタデータと属性の取得と設定」および 「 アプリケーションでのメタデータと属性の取得と設定」を参照してください。
Windows Media デバイス マネージャーでは、特定の種類のメディア (プレイリスト用の "My Playlists" フォルダーなど) を保持する標準のフォルダー セットは公開されません。 すべてのデバイスには固有のファイル システムがあり、特定のファイルを検索または送信する適切な場所を決定する必要があります。
注意
Windows エクスプローラーでは、デバイスに実際には存在しない仮想フォルダーを表示できます。 仮想フォルダーの例としては、MTP デバイス用に表示される "メディア" フォルダーと "データ" フォルダーがあります。 これらのフォルダーは、エンド ユーザーのダウンロードを簡単にするために Windows によって作成されます。実際にはデバイスには存在しません。 アプリケーションは、これらの種類の一般的なフォルダーを見つけることに依存しないようにする必要があります。 逆に、Windows エクスプローラーには、デバイス上に存在するフォルダーやオブジェクト (プレイリストなど) が表示されない場合があります。
次の C++ コード例は、デバイスの再帰的な探索を示しています。 次の 2 つの関数を使用します。
- 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;
}
関連トピック