Включение уведомлений
Диспетчер устройств Windows Media объявляет четыре интерфейса, которые приложение может реализовать в com-классе для получения уведомлений о событиях. Эти интерфейсы делятся на две группы, как показано в следующей таблице.
Интерфейсы | Описание |
---|---|
IWMDMNotification | Уведомляет приложение о подключении или отключении устройств или носителей хранилища. |
IWMDMProgress IWMDMProgress2 IWMDMProgress3 |
Очень простая система уведомлений для оповещения приложения о ходе любого события. Приложению не требуется выполнять какие-либо действия в ответ на эти сообщения. |
IWMDMNotification
IWMDMNotification оповещает приложение при подключении или отключении устройств Plug and Play от компьютера, а также при вставке или удалении носителей хранилища Plug and Play (например, флэш-карт) с устройства. Эти уведомления могут помочь приложению обновить пользовательский интерфейс, чтобы отразить изменения.
Для получения этих уведомлений ваше приложение должно зарегистрироваться для их получения, используя Platform SDK и интерфейсы IConnectionPointContainer и IConnectionPoint. Приложение должно регистрироваться для приема событий при запуске и отменять регистрацию при закрытии. Выполните следующие действия, чтобы зарегистрироваться для получения этих уведомлений.
- Запросите основной интерфейс IWMDeviceManager, который вы получили при аутентификации вашего приложения для IConnectionPointContainer.
- Вызовите IConnectionPointContainer::FindConnectionPoint, чтобы получить точку соединения контейнера для интерфейсов IWMDMNotification.
- Зарегистрируйтесь, чтобы получать события, вызвав метод IConnectionPoint::Advise. Передайте класс, реализующий IWMDMNotification, и извлеките файл cookie, уникальный идентификатор, определяющий точку подключения. Это должно храниться и использоваться позже для отмены регистрации уведомлений о событиях.
В следующем коде C++ показано, как зарегистрироваться для получения уведомлений от IWMDMNotification.
HRESULT CWMDMController::RegisterForNotifications()
{
HRESULT hr = S_OK;
CComPtr<IConnectionPointContainer> pConxnPointCont;
CComPtr<IConnectionPoint> pIConnPoint;
// Get the IConnectionPointContainer interface from IWMDeviceManager.
if (SUCCEEDED (hr = m_IWMDMDeviceMgr->QueryInterface(IID_IConnectionPointContainer, (void**) & pConxnPointCont)))
{
// Get a connection point from the container.
if (SUCCEEDED (hr = pConxnPointCont->FindConnectionPoint(IID_IWMDMNotification, &pIConnPoint)))
{
// Add ourselves as a callback handler for the connection point.
// If we succeeded, indicate that by storing the connection point ID.
DWORD dwCookie;
if (SUCCEEDED (hr = pIConnPoint->Advise((IUnknown*)((IWMDMNotification*)this), &dwCookie)))
{
m_dwNotificationCookie = dwCookie;
}
}
}
return hr;
}
Когда ваше приложение закрывается, вы должны отменить регистрацию на IConnectionPoint, чтобы указать, что он больше не должен отправлять вам уведомления. Выполните следующие действия, чтобы отменить регистрацию уведомлений:
- Запросите основной интерфейс IWMDeviceManager для IConnectionPointContainer.
- Получите точку подключения для интерфейсов IWMDMNotification.
- Отмените регистрацию вашего приложения для уведомления о событиях, вызвав IConnectionPoint::Unadviseи передав уникальный идентификатор, полученный при регистрации на получение событий.
В следующем коде C++ показано, как снять регистрацию на события IWMDMNotification при закрытии вашего приложения.
HRESULT CWMDMController::UnregisterForNotifications()
{
HRESULT hr = S_FALSE;
// On class initialization, we initialized the handle to -1 as a flag
// to indicate we had not yet registered for notifications. If registration
// never happened, don't bother to unregister.
if (-1 != m_dwNotificationCookie)
{
CComPtr<IConnectionPointContainer> pConxnPointCont;
CComPtr<IConnectionPoint> pIConnPoint;
// Get the connection point container from IWMDeviceManager.
if (SUCCEEDED (hr =
m_IWMDMDeviceMgr->QueryInterface(IID_IConnectionPointContainer,
(void**) & pConxnPointCont)))
{
// Get a connection point from the container.
if (SUCCEEDED (hr = pConxnPointCont->FindConnectionPoint(IID_IWMDMNotification, &pIConnPoint)))
{
// Remove ourselves as a callback from the connection point.
// If successful, reset the ID to a flag value.
if (SUCCEEDED (hr =
pIConnPoint->Unadvise(m_dwNotificationCookie)))
{
m_dwNotificationCookie = -1;
hr = S_OK;
}
}
}
}
return hr;
}
Использование IWMDMProgress
Диспетчер устройств Windows Media может отправлять сообщения о состоянии вашего приложения при определенных действиях, таких как передача содержимого, получение защищенных часов и получение сведений о файле DRM. Приложение может использовать эти сообщения для отслеживания состояния события или отмены события. Чтобы использовать этот интерфейс, реализуйте IWMDMProgress, IWMDMProgress2или IWMDMProgress3и передайте его в качестве параметра методу, который примет сообщение о ходе выполнения. Обратите внимание, что IWMDMProgress3 является превосходным интерфейсом, так как он предоставляет GUID, указывающий, какое действие отслеживается. Следующие методы приложения принимают интерфейс отслеживания хода выполнения (соответствующие методы поставщика услуг должны иметь возможность отправлять уведомления в данный интерфейс):
IWMDMStorageGlobals::Initialize
IWMDRMDeviceApp::AcquireDeviceData
Примеры передачи интерфейса в метод приведены в документации по этим методам. Примеры реализации интерфейсов обратного вызова см. в документации по методам IWMDMProgress, IWMDMProgress2или IWMDMProgress3.