我的com件内使用了一个第三方的com件,这个com里有个事件
我需要在我的com件内捕获这个事件并做处理
但是我的代码每次只能捕获到2次,到第三次响应事件就出错乐
vc ide报的是(第三方com件名)Access Violation
我不知道是我这里出错还是它里面有问题,请大家帮忙看看他们的组件我是#import用的我的代码如下
使用的成员变量
CEventSink* m_pSink;
IComXXXPtr m_pMails; //第三方Com
LPCONNECTIONPOINT m_pConnPt;
LPCONNECTIONPOINTCONTAINER pConnPtCont;
DWORD m_dwCookie;构造函数{
m_pMails.CreateInstance(__uuidof(ComXXX));
m_pSink=new CEventSink;
HRESULT hr=m_pMails->QueryInterface(IID_IConnectionPointContainer,(void**)&pConnPtCont);
if(FAILED(hr)) {
return;
}
hr=pConnPtCont->FindConnectionPoint(DIID__IAsyncServerMailslotEvents,&m_pConnPt);
if(FAILED(hr)) {
pConnPtCont->Release();
return;
}
hr=m_pConnPt->Advise((IUnknown *)m_pSink,&m_dwCookie);
if(FAILED(hr)) {
return;
}
}
析构函数{
m_pConnPt->Unadvise(m_dwCookie);
delete m_pSink;
pConnPtCont->Release();
m_pConnPt->Release();
}CEventSink 类
class CEventSink : public IDispEventImpl<1,CEventSink,&DIID__IComXXXEvents,&LIBID_ComLib>
{
public:
CEventSink();
virtual ~CEventSink();
void __stdcall OnDataRecieved(IComXXXPtr pData){
//这个方法不知为何被那个com件调了2次后就不再被调用了
long lngevtType,lngevtValue;
CComBSTR bstrevtData,bstrusrData;
HRESULT hr=pData->ReadEventData(&lngevtType,&lngevtValue,&bstrevtData,&bstrusrData);}
BEGIN_SINK_MAP(CEventSink)
SINK_ENTRY_INFO(1,DIID__IComXXXEvents,DISPID_DATARECIEVED,OnDataRecieved,&OnDataRecievedInfo)
END_SINK_MAP()
};
我需要在我的com件内捕获这个事件并做处理
但是我的代码每次只能捕获到2次,到第三次响应事件就出错乐
vc ide报的是(第三方com件名)Access Violation
我不知道是我这里出错还是它里面有问题,请大家帮忙看看他们的组件我是#import用的我的代码如下
使用的成员变量
CEventSink* m_pSink;
IComXXXPtr m_pMails; //第三方Com
LPCONNECTIONPOINT m_pConnPt;
LPCONNECTIONPOINTCONTAINER pConnPtCont;
DWORD m_dwCookie;构造函数{
m_pMails.CreateInstance(__uuidof(ComXXX));
m_pSink=new CEventSink;
HRESULT hr=m_pMails->QueryInterface(IID_IConnectionPointContainer,(void**)&pConnPtCont);
if(FAILED(hr)) {
return;
}
hr=pConnPtCont->FindConnectionPoint(DIID__IAsyncServerMailslotEvents,&m_pConnPt);
if(FAILED(hr)) {
pConnPtCont->Release();
return;
}
hr=m_pConnPt->Advise((IUnknown *)m_pSink,&m_dwCookie);
if(FAILED(hr)) {
return;
}
}
析构函数{
m_pConnPt->Unadvise(m_dwCookie);
delete m_pSink;
pConnPtCont->Release();
m_pConnPt->Release();
}CEventSink 类
class CEventSink : public IDispEventImpl<1,CEventSink,&DIID__IComXXXEvents,&LIBID_ComLib>
{
public:
CEventSink();
virtual ~CEventSink();
void __stdcall OnDataRecieved(IComXXXPtr pData){
//这个方法不知为何被那个com件调了2次后就不再被调用了
long lngevtType,lngevtValue;
CComBSTR bstrevtData,bstrusrData;
HRESULT hr=pData->ReadEventData(&lngevtType,&lngevtValue,&bstrevtData,&bstrusrData);}
BEGIN_SINK_MAP(CEventSink)
SINK_ENTRY_INFO(1,DIID__IComXXXEvents,DISPID_DATARECIEVED,OnDataRecieved,&OnDataRecievedInfo)
END_SINK_MAP()
};
但是那个例子没什么问题
我现在是在我的组件里包含他的com
然后用了一个vb form来调用的我com做debug(准备用于scripts)
现在就是这样了
他的事件中
OnDataRecieved(IComXXXPtr pData)
会传进一个ptr,我原先直接使用他的IComXXXPtr
现在该为IDispatch *,然后在事件里cast成那个ptr就行了
不明白为什么?谁知道,麻烦说一下
等一下就结分
IComXXXPtr m_pMails; //第三方Com
同一个COM对象的两个接口,是COM对象被delete了