Windows Media デバイス マネージャー デバイスの列挙
アプリケーションを認証したら、Windows Media デバイス マネージャーによって検出されたデバイスの列挙を開始できます。 列挙は、IWMDeviceManager2::EnumDevices2 または IWMDeviceManager::EnumDevices を使用して取得された列挙インターフェイス IWMDMEnumDevice を使用して行われます。 サポートされている場合は、 EnumDevices2 メソッドを使用します。以前のバージョンではデバイス上のレガシ インターフェイスのみが返されたのに対し、新しいバージョンではレガシ インターフェイスと新しいインターフェイスの両方が返されるためです。
列挙子を取得する前に、使用する列挙ビューを決定する必要があります。 一部のデバイスでは、各ストレージが異なるデバイスとして公開されます。 たとえば、デバイス上の 2 つのフラッシュ メモリ カードは、別のデバイスであるかのように列挙されます。 デバイス上のすべてのストレージを 1 つのデバイスとして列挙するように指定できます。 この設定は、アプリケーションで 1 回だけ設定できます。変更する場合は、アプリケーションをシャットダウンして再起動する必要があります。 ただし、レガシ デバイスでは、個別のデバイス ストレージを 1 つのデバイスとして列挙し、個別に列挙し続ける要求が無視される場合があることに注意してください。
次の手順は、接続されているデバイスを列挙する方法を示しています。
- IWMDeviceManager3::SetDeviceEnumPreference を使用して、デバイス列挙の基本設定を設定します。 このメソッドが呼び出されない場合、既定のメソッドはストレージを個別のデバイスとして表示することです。 個々の "デバイス" が実際に同じデバイス上のストレージであるかどうかを判断するには、 IWMDMDevice2::GetCanonicalName を呼び出します。同じデバイスのストレージは、最後の "$" 記号の後の最後の数字を除き、同じ値を返します。
- IWMDeviceManager または IWMDeviceManager2 のクエリを実行し、IWMDeviceManager2::EnumDevices2 を呼び出してデバイス列挙子インターフェイス IWMDMEnumDevice を取得します。 (サポートされている場合は、以前のバージョンでは MTP デバイスが返されない可能性があるため、より効率的な EnumDevices2 を使用してください)。
- IWMDMEnumDevices::Next メソッドを呼び出して、一度に 1 つ以上のデバイスを取得します。 メソッドがS_FALSEまたはエラー メッセージを返すまで、このメソッドを呼び出し続けます。 一度に 1 つのデバイスのみを取得する場合は、デバイスを保持する配列を割り当てる必要はありません。
ユーザーは、アプリケーションの実行中にコンピューターからデバイスをアタッチまたは削除できるため、デバイス接続または削除の通知を実装することをお勧めします。 これを行うには、 IWMDMNotification インターフェイスを実装して登録します。 詳細については、「 通知の有効化」を参照してください。
次の C++ コードは、デバイスを列挙し、各デバイスに関する情報を要求します。
HRESULT CWMDMController::EnumDevices()
{
HRESULT hr = S_OK;
// Change behavior to show devices as one object, not each storage as a device.
// This can be called only once for each instance of this application.
CComQIPtr<IWMDeviceManager3>pDevMgr3(m_IWMDMDeviceMgr);
hr = pDevMgr3->SetDeviceEnumPreference(DO_NOT_VIRTUALIZE_STORAGES_AS_DEVICES);
// Get number of attached devices.
DWORD iDevices = 0;
hr = m_IWMDMDeviceMgr->GetDeviceCount(&iDevices);
if (hr == S_OK)
{
// TODO: Display count of devices.
}
//
// Get a device enumerator to enumerate devices.
//
CComPtr<IWMDeviceManager2> pDevMgr2;
hr = m_IWMDMDeviceMgr->QueryInterface (__uuidof(IWMDeviceManager2), (void**) &pDevMgr2);
if (hr == S_OK)
{
// TODO: Display message indicating that application obtained IWMDeviceManager2.
}
else
{
// TODO: Display message indicating that we couldn't
// get IWMDeviceManager2 in EnumDevices.
return hr;
}
CComPtr<IWMDMEnumDevice> pEnumDevice;
hr = pDevMgr2->EnumDevices2(&pEnumDevice);
if (hr != S_OK)
{
// TODO: Display messaging indicating that an error occurred
// in calling EnumDevices2.
return hr;
}
// Length of all the strings we'll send in.
const UINT MAX_CHARS = 100;
// Iterate through devices.
while(TRUE)
{
// Get a device handle.
IWMDMDevice *pIWMDMDevice;
ULONG ulFetched = 0;
hr = pEnumDevice->Next(1, &pIWMDMDevice, &ulFetched);
if ((hr != S_OK) || (ulFetched != 1))
{
break;
}
// Get a display icon for the device.
ULONG deviceIcon = 0;
hr = pIWMDMDevice->GetDeviceIcon(&deviceIcon);
// Print the device manufacturer.
WCHAR manufacturer[MAX_CHARS];
hr = pIWMDMDevice->GetManufacturer((LPWSTR)&manufacturer, MAX_CHARS);
if (hr == S_OK)
{
// TODO: Display manufacturer name.
}
// Get the device name.
WCHAR name[MAX_CHARS];
hr = pIWMDMDevice->GetName((LPWSTR)&name, MAX_CHARS);
if (hr == S_OK)
{
// TODO: Display name.
}
// TODO: Get other device information if wanted.
// Obtain an IWMDMDevice2 interface and call some methods.
CComQIPtr<IWMDMDevice2> pIWMDMDevice2(pIWMDMDevice);
if (pIWMDMDevice2 != NULL)
{
// Get the canonical name.
WCHAR canonicalName[MAX_CHARS];
hr = pIWMDMDevice2->GetCanonicalName(canonicalName, MAX_CHARS);
if (hr == S_OK)
{
// TODO: Display canonical name.
}
}
// Obtain an IWMDMDevice3 interface and call some methods.
CComQIPtr<IWMDMDevice3>pIWMDMDevice3(pIWMDMDevice);
if (pIWMDMDevice3 != NULL)
{
// Find out what protocol is being used.
PROPVARIANT val;
PropVariantInit(&val);
hr = pIWMDMDevice3->GetProperty(g_wszWMDMDeviceProtocol, &val);
if (hr == S_OK)
{
if (*val.puuid == WMDM_DEVICE_PROTOCOL_RAPI)
{
// TODO: Display message indicating device is a RAPI device.
}
else if (*val.puuid == WMDM_DEVICE_PROTOCOL_MTP)
{
/ /TODO: Display message indicating device is an MTP device.
}
else if (*val.puuid == WMDM_DEVICE_PROTOCOL_MSC)
{
// TODO: Display message indicating device is an MSC device.
}
else
{
// TODO: Display message indicating that the
// application encountered an unknown protocol.
}
PropVariantClear(&val);
}
}
// Examine the device capabilities. You could use some of these
// to enable or disable the application's UI elements.
CComQIPtr<IWMDMDeviceControl> pDeviceControl(pIWMDMDevice);
if (pDeviceControl != NULL)
{
DWORD caps = 0;
hr = pDeviceControl->GetCapabilities(&caps);
if (caps & WMDM_DEVICECAP_CANPLAY)
{
// TODO: Display message indicating that the media
// device can play MP3 audio.
}
// TODO: Test for other capabilities here.
}
} // Get the next device.
return hr;
}
関連トピック