NOT PART OF BUILD. Event Sink dumps some info about the event the control has fired

This commit is contained in:
locka%iol.ie 2002-09-30 13:49:22 +00:00
parent cbad09254c
commit 13c73dea62
2 changed files with 40 additions and 12 deletions

View File

@ -53,7 +53,7 @@ CControlEventSink::~CControlEventSink()
}
BOOL
CControlEventSink::GetEventSinkIID(IUnknown *pControl, IID &iid)
CControlEventSink::GetEventSinkIID(IUnknown *pControl, IID &iid, ITypeInfo **typeInfo)
{
iid = GUID_NULL;
if (!pControl)
@ -62,15 +62,15 @@ CControlEventSink::GetEventSinkIID(IUnknown *pControl, IID &iid)
}
// IProvideClassInfo2 way is easiest
CComQIPtr<IProvideClassInfo2> classInfo2 = pControl;
if (classInfo2)
{
classInfo2->GetGUID(GUIDKIND_DEFAULT_SOURCE_DISP_IID, &iid);
if (!::IsEqualIID(iid, GUID_NULL))
{
return TRUE;
}
}
// CComQIPtr<IProvideClassInfo2> classInfo2 = pControl;
// if (classInfo2)
// {
// classInfo2->GetGUID(GUIDKIND_DEFAULT_SOURCE_DISP_IID, &iid);
// if (!::IsEqualIID(iid, GUID_NULL))
// {
// return TRUE;
// }
// }
// Yuck, the hard way
CComQIPtr<IProvideClassInfo> classInfo = pControl;
@ -109,6 +109,11 @@ CControlEventSink::GetEventSinkIID(IUnknown *pControl, IID &iid)
if (SUCCEEDED(eventSinkTypeInfo->GetTypeAttr(&eventSinkAttr)))
{
iid = eventSinkAttr->guid;
if (typeInfo)
{
*typeInfo = eventSinkTypeInfo.p;
(*typeInfo)->AddRef();
}
eventSinkTypeInfo->ReleaseTypeAttr(eventSinkAttr);
}
}
@ -145,7 +150,8 @@ HRESULT CControlEventSink::SubscribeToEvents(IUnknown *pControl)
// to events via the connection point container.
IID iidEventSink;
if (!GetEventSinkIID(pControl, iidEventSink))
CComPtr<ITypeInfo> typeInfo;
if (!GetEventSinkIID(pControl, iidEventSink, &typeInfo))
{
return E_FAIL;
}
@ -170,6 +176,7 @@ HRESULT CControlEventSink::SubscribeToEvents(IUnknown *pControl)
m_spEventCP = cp;
m_dwEventCookie = dwCookie;
m_spEventSinkTypeInfo = typeInfo;
return S_OK;
}
@ -197,7 +204,27 @@ HRESULT STDMETHODCALLTYPE CControlEventSink::GetIDsOfNames(/* [in] */ REFIID rii
HRESULT STDMETHODCALLTYPE CControlEventSink::Invoke(/* [in] */ DISPID dispIdMember, /* [in] */ REFIID riid, /* [in] */ LCID lcid, /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, /* [out] */ VARIANT __RPC_FAR *pVarResult, /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, /* [out] */ UINT __RPC_FAR *puArgErr)
{
FUNCDESC *pFuncDesc = NULL;
if (m_spEventSinkTypeInfo)
m_spEventSinkTypeInfo->GetFuncDesc(dispIdMember, &pFuncDesc);
#ifdef DEBUG
ATLTRACE(_T("Invoke(%d)\n"), (int) dispIdMember);
if (m_spEventSinkTypeInfo)
{
UINT cNames = 0;
CComBSTR bstrName;
m_spEventSinkTypeInfo->GetNames(dispIdMember, &bstrName, 1, &cNames);
ATLTRACE(_T(" %S\n"), bstrName.m_str);
}
if (pFuncDesc)
{
}
#endif
if (m_spEventSinkTypeInfo)
{
m_spEventSinkTypeInfo->ReleaseFuncDesc(pFuncDesc);
}
return S_OK;
}

View File

@ -51,6 +51,7 @@ public:
// Current event connection point
CComPtr<IConnectionPoint> m_spEventCP;
CComPtr<ITypeInfo> m_spEventSinkTypeInfo;
DWORD m_dwEventCookie;
IID m_EventIID;
@ -77,7 +78,7 @@ END_COM_MAP()
virtual HRESULT SubscribeToEvents(IUnknown *pControl);
virtual void UnsubscribeFromEvents();
virtual BOOL GetEventSinkIID(IUnknown *pControl, IID &iid);
virtual BOOL GetEventSinkIID(IUnknown *pControl, IID &iid, ITypeInfo **typeInfo);
// IDispatch
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(/* [out] */ UINT __RPC_FAR *pctinfo);