Как правильно отменить регистрацию при получении уведомлений с помощью 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 также работала правильно.

Другие вопросы по тегам