Question

In the documentation for Mobile Broadband API, it says:

The following procedure describes how to register for notifications.

1.Get an IConnectionPointContainer interface by calling QueryInterface on an IMbnInterfaceManager > object.
2.Call FindConnectionPoint on the returned interface and pass IID_IMbnPinEvents to riid.
3.Call Advise on the returned connection point and pass a pointer to an IUnknown interface on an > object that implements IMbnPinEvents to pUnk.

Notifications can be terminated by calling Unadvise on the connection point returned in step 2.

I have got some code that carries out the first 3 steps, and it successfully registers for MBN events. However, now I need to de-register temporarily from receiving these events.
So, after a couple of first attempts that ended with COM exceptions, I tried the following code (with try/catch blocks):

//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);
}

When I run this code, I get no errors or exceptions from MBN. But the event handlers aren't de-registered. I can still see in the log files, MBN events arriving and being handled.

Can anyone tell me what I am missing? Thank you.

Was it helpful?

Solution

I think I figured out the problem. I have many different types of GUIDs, and I thought they all used the same IConnectionPoint, so I saved it to the same object in the RegisterEvent function.

When I tried creating a new IConnectionPoint object for each GUID, and saving each IConnectionPoint separately, the DeregisterEvent function also worked properly.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top