Menghitung perangkat Windows Media Device Manager
Setelah mengautentikasi aplikasi, Anda dapat mulai menghitung perangkat yang terdeteksi oleh Windows Media Device Manager. Enumerasi dilakukan dengan menggunakan antarmuka enumerasi, IWMDMEnumDevice, yang diperoleh dengan menggunakan IWMDeviceManager2::EnumDevices2 atau IWMDeviceManager::EnumDevices. Jika didukung, gunakan metode EnumDevices2 , karena versi sebelumnya hanya mengembalikan antarmuka warisan pada perangkat, sedangkan versi baru mengembalikan warisan dan antarmuka baru.
Sebelum mendapatkan enumerator, Anda harus memutuskan tampilan enumerasi apa yang akan digunakan. Beberapa perangkat mengekspos setiap penyimpanan sebagai perangkat yang berbeda. Misalnya, dua kartu memori flash pada perangkat akan menghitung seolah-olah kartu memori tersebut adalah perangkat terpisah. Anda dapat menentukan bahwa semua penyimpanan pada perangkat dijumlahkan bersama-sama sebagai satu perangkat. Anda hanya dapat mengatur preferensi ini sekali dalam aplikasi Anda; jika Anda ingin mengubahnya, Anda harus mematikan aplikasi dan menghidupkannya kembali. Namun, perhatikan bahwa perangkat warisan terkadang akan mengabaikan permintaan untuk menghitung penyimpanan perangkat terpisah sebagai satu perangkat, dan terus menghitungnya secara terpisah.
Langkah-langkah berikut menunjukkan cara menghitung perangkat yang terhubung:
- Atur preferensi enumerasi perangkat menggunakan IWMDeviceManager3::SetDeviceEnumPreference. Jika metode ini tidak dipanggil, metode defaultnya adalah menampilkan penyimpanan sebagai perangkat terpisah. Untuk menentukan apakah individu "perangkat" benar-benar penyimpanan pada perangkat yang sama, panggil IWMDMDevice2::GetCanonicalName; penyimpanan dari perangkat yang sama akan mengembalikan nilai yang identik, kecuali untuk digit akhir setelah tanda "$" terakhir.
- Kueri untuk IWMDeviceManager atau IWMDeviceManager2, lalu panggil IWMDeviceManager2::EnumDevices2 untuk mendapatkan antarmuka enumerator perangkat, IWMDMEnumDevice. (Jika didukung, gunakan EnumDevices2, yang lebih efisien, karena versi sebelumnya mungkin tidak mengembalikan perangkat MTP).
- Panggil metode IWMDMEnumDevices::Next untuk mengambil satu atau beberapa perangkat pada satu waktu. Terus panggil metode ini hingga metode mengembalikan S_FALSE atau pesan kesalahan. Jika hanya mengambil satu perangkat pada satu waktu, Anda tidak perlu mengalokasikan array untuk menahan perangkat.
Karena pengguna dapat melampirkan atau menghapus perangkat dari komputer saat aplikasi Anda berjalan, ada baiknya untuk menerapkan pemberitahuan koneksi atau penghapusan perangkat. Ini dilakukan dengan mengimplementasikan antarmuka IWMDMNotification dan mendaftarkannya. Untuk informasi selengkapnya tentang ini, lihat Mengaktifkan Pemberitahuan.
Kode C++ berikut menghitung perangkat dan meminta informasi tentang setiap perangkat.
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;
}
Topik terkait