I have created an event sink in my ATL COM project. The event sink receives
events from a C# component. There is no problem with receving events but
when my COM object is released I get an access violation - (MSCORWKS.DLL):
0xC0000005: Access Violation.
Here's my event sink class:
namespace
{
static const int EVENT_ID = 111;//any arbitary value
static const int DISPID_UPDATE_PROGRESS = 1;//disp id of UpdateProgress...
_ATL_FUNC_INFO OnUpdateProgressInfo =
{
CC_STDCALL, //calling conv...
VT_EMPTY,//return value...
1 ,//number of arguments...
{ VT_I4}//argument types...
};
}
class CEventSink : public
IDispEventSimpleImpl<EVENT_ID,CEventSink,&DIID_ITr ansferModuleEvent>
{
public:
CEventSink();
virtual ~CEventSink();
CConsumerAccess* m_pParent;
inline void SetParent(CConsumerAccess* pParent= NULL) { m_pParent =
pParent; }
void __stdcall OnUpdateProgress( long lResult);
BEGIN_SINK_MAP(CEventSink)
SINK_ENTRY_INFO(EVENT_ID,DIID_ITransferModuleEvent ,DISPID_UPDATE_PROGRESS,On
UpdateProgress,&OnUpdateProgressInfo)
END_SINK_MAP()
};
I attach and detach the event sink in my COM object code in the following
way:
void CConsumerAccess::EnsureEventSinkAttached()
{
if(m_pSinkClass == NULL)
{
m_pSinkClass = new CEventSink();
m_pSinkClass->SetParent(this);
m_pSinkClass->DispEventAdvise((IDispatch*)m_pTransferModule,&DI ID_ITransferM
oduleEvent);
}
}
void CConsumerAccess::DetachEventSink()
{
if(m_pSinkClass)
{
m_pSinkClass->DispEventUnadvise((IDispatch*)m_pTransferModule );
delete m_pSinkClass ;
m_pSinkClass = NULL;
}
}
I don't know what could be causing this problem. Its definitely related to
the event sink because if I don't use it I don't get an access violation.
I would really appreciate some help on this.