我的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()
};

解决方案 »

  1.   

    原来对方提供的是vb的例子代码
    但是那个例子没什么问题
    我现在是在我的组件里包含他的com
    然后用了一个vb form来调用的我com做debug(准备用于scripts)
    现在就是这样了
      

  2.   

    现在搞定了,好了好了
    他的事件中
    OnDataRecieved(IComXXXPtr pData)
    会传进一个ptr,我原先直接使用他的IComXXXPtr
    现在该为IDispatch *,然后在事件里cast成那个ptr就行了
    不明白为什么?谁知道,麻烦说一下
    等一下就结分
      

  3.   

    OnDataRecieved(IComXXXPtr pData),每次调用都产生一个IComXXXPtr(继承自_com_ptr_t)的临时变量,临时变量析构的时候,会调用封装com指针的release,导致com组件提前卸载
      

  4.   

    对不起,写错了,那个OnDataRecieved里的IComXXXPtr只是那个Com件暴露出的另一个接口,和最上面的那个pMails不同,难道OnDataRecieved的那个临时接口析构时会把Sink接口也析构吗?
      

  5.   

    IComXXXPtr只是那个Com件暴露出的另一个接口,
    IComXXXPtr m_pMails; //第三方Com
    同一个COM对象的两个接口,是COM对象被delete了