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_P ROGRESS = 1;//disp id of UpdateProgress. ..
_ATL_FUNC_INFO OnUpdateProgres sInfo =
{
CC_STDCALL, //calling conv...
VT_EMPTY,//return value...
1 ,//number of arguments...
{ VT_I4}//argument types...
};
}
class CEventSink : public
IDispEventSimpl eImpl<EVENT_ID, CEventSink,&DII D_ITransferModu leEvent>
{
public:
CEventSink();
virtual ~CEventSink();
CConsumerAccess * m_pParent;
inline void SetParent(CCons umerAccess* pParent= NULL) { m_pParent =
pParent; }
void __stdcall OnUpdateProgres s( long lResult);
BEGIN_SINK_MAP( CEventSink)
SINK_ENTRY_INFO (EVENT_ID,DIID_ ITransferModule Event,DISPID_UP DATE_PROGRESS,O n
UpdateProgress, &OnUpdateProgre ssInfo)
END_SINK_MAP()
};
I attach and detach the event sink in my COM object code in the following
way:
void CConsumerAccess ::EnsureEventSi nkAttached()
{
if(m_pSinkClass == NULL)
{
m_pSinkClass = new CEventSink();
m_pSinkClass->SetParent(this );
m_pSinkClass->DispEventAdvis e((IDispatch*)m _pTransferModul e,&DIID_ITransf erM
oduleEvent);
}
}
void CConsumerAccess ::DetachEventSi nk()
{
if(m_pSinkClass )
{
m_pSinkClass->DispEventUnadv ise((IDispatch* )m_pTransferMod ule);
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.
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_P ROGRESS = 1;//disp id of UpdateProgress. ..
_ATL_FUNC_INFO OnUpdateProgres sInfo =
{
CC_STDCALL, //calling conv...
VT_EMPTY,//return value...
1 ,//number of arguments...
{ VT_I4}//argument types...
};
}
class CEventSink : public
IDispEventSimpl eImpl<EVENT_ID, CEventSink,&DII D_ITransferModu leEvent>
{
public:
CEventSink();
virtual ~CEventSink();
CConsumerAccess * m_pParent;
inline void SetParent(CCons umerAccess* pParent= NULL) { m_pParent =
pParent; }
void __stdcall OnUpdateProgres s( long lResult);
BEGIN_SINK_MAP( CEventSink)
SINK_ENTRY_INFO (EVENT_ID,DIID_ ITransferModule Event,DISPID_UP DATE_PROGRESS,O n
UpdateProgress, &OnUpdateProgre ssInfo)
END_SINK_MAP()
};
I attach and detach the event sink in my COM object code in the following
way:
void CConsumerAccess ::EnsureEventSi nkAttached()
{
if(m_pSinkClass == NULL)
{
m_pSinkClass = new CEventSink();
m_pSinkClass->SetParent(this );
m_pSinkClass->DispEventAdvis e((IDispatch*)m _pTransferModul e,&DIID_ITransf erM
oduleEvent);
}
}
void CConsumerAccess ::DetachEventSi nk()
{
if(m_pSinkClass )
{
m_pSinkClass->DispEventUnadv ise((IDispatch* )m_pTransferMod ule);
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.