Как правильно отменить регистрацию при получении уведомлений с помощью IConnectPoint Unadvise?
В документации по Mobile Broadband API говорится:
Следующая процедура описывает, как зарегистрироваться для уведомлений.
1. Получите интерфейс IConnectionPointContainer, вызвав QueryInterface для объекта IMbnInterfaceManager >.
2.Вызовите FindConnectionPoint на возвращенном интерфейсе и передайте RID IID_IMbnPinEvents.
3.Call Консультирование по возвращенной точке подключения и передача указателя на интерфейс IUnknown в> объекте, который реализует IMbnPinEvents, в pUnk.Уведомления могут быть прекращены путем вызова Unadvise на точке подключения, возвращенной на шаге 2.
У меня есть некоторый код, который выполняет первые 3 шага, и он успешно регистрируется для событий MBN. Однако теперь мне нужно временно отменить регистрацию получения этих событий.
Итак, после пары первых попыток, которые закончились исключениями COM, я попробовал следующий код (с блоками try/catch):
//First get the notifications
public void RegisterEvent(object iUnk, Guid guid, out uint storedTag)
{
IConnectionPoint icp = null;
Guid curGuid = guid;
storedTag = 0;
if ((curGuid == typeof(IMbnInterfaceManagerEvents).GUID) )
{
// For this event, the connection point is defined on the interface manager object
m_InterfaceManagerCPC.FindConnectionPoint(ref curGuid, out icp);
// Call Advise on the connection point to register
icp.Advise(iUnk, out storedTag);
//Save the IConnectionPoint object
interfaceManagerCP = icp;
}
//Now deregister the events
public void DeregisterEvent(Guid guid, uint storedTag)
{
IConnectionPoint icp = null;
Guid curGuid = guid;
// Find the appropriate connection point to call Unadvise on
if ((curGuid == typeof(IMbnInterfaceManagerEvents).GUID) )
{
// Call Unadvise on the saved connection point to de-register
interfaceManagerCP.Unadvise(storedTag);
}
Когда я запускаю этот код, я не получаю ошибок или исключений из MBN. Но обработчики событий не отменяются. Я все еще могу видеть в файлах журнала события MBN, поступающие и обрабатываемые.
Может кто-нибудь сказать мне, что мне не хватает? Спасибо.
1 ответ
Я думаю, что я понял проблему. У меня много разных типов GUID, и я подумал, что все они используют один и тот же IConnectionPoint, поэтому я сохранил его в одном и том же объекте в функции RegisterEvent.
Когда я попытался создать новый объект IConnectionPoint для каждого GUID и сохранить каждую IConnectionPoint отдельно, функция DeregisterEvent также работала правильно.