Re: Not receiving implemented events.
In this case, I'd put breakpoints into
IConnectionPointContainer::FindConnectionPoint and
IConnectionPoint::Advise, and try to figure out why the client fails to
advise its sink.
--
With best wishes,
Igor Tandetnik
Thanks Igor. I've tried this - the results are puzzling. The program
flow falls into the following Advise function when the VB test app
starts up.
[code]
template <class T, const IID* piid, class CDV>
STDMETHODIMP IConnectionPointImpl<T, piid, CDV>::Advise(IUnknown*
pUnkSink,
DWORD* pdwCookie)
{
T* pT = static_cast<T*>(this);
IUnknown* p;
HRESULT hRes = S_OK;
if (pdwCookie != NULL)
*pdwCookie = 0;
if (pUnkSink == NULL || pdwCookie == NULL)
return E_POINTER;
IID iid;
GetConnectionInterface(&iid);
hRes = pUnkSink->QueryInterface(iid, (void**)&p);
if (SUCCEEDED(hRes))
{
pT->Lock();
*pdwCookie = m_vec.Add(p);
hRes = (*pdwCookie != NULL) ? S_OK : CONNECT_E_ADVISELIMIT;
pT->Unlock();
if (hRes != S_OK)
p->Release();
}
else if (hRes == E_NOINTERFACE)
hRes = CONNECT_E_CANNOTCONNECT;
if (FAILED(hRes))
*pdwCookie = 0;
return hRes;
}
[/code]
I can see that the QueryInterface is successful and the m_vec.Add(p)
call successfully adds the interface to the vector map. Nothing else
seems to happen until I make the test call into the server, which
calls the event Fire_ method. At this point the m_vec map is empty and
contains no interface pointers! Do you know of any way this vector
could be cleared down? Is there somewhere else I can break in to get a
clearer view of where it might be happening. Your help so far has been
great.
BTW Alexander:
I assume you are referring to the following, which does seem to be
correctly in the connection map.
BEGIN_CONNECTION_POINT_MAP(CCoMessageEventTest)
...
CONNECTION_POINT_ENTRY(__uuidof(DThirdPartyEvents))
END_CONNECTION_POINT_MAP()
As a matter of interest, by source dispinterface, I assume you are
referring to the Event interface I have implemented (not any interface
local/specific to the server.)
Regards,
Fergus