描述:
关于连接点的问题,advise返回E_NOTIMPL
SINK的代码
CConnSink::CConnSink(DWORD mti_in)
{
mti=mti_in;
}
CConnSink::~CConnSink(void)
{
}
STDMETHODIMP CConnSink::QueryInterface(const struct _GUID &iid,void ** ppv)
{
*ppv=this;
return S_OK;
}
ULONG __stdcall CConnSink::AddRef(void)
{ return 1; }
ULONG __stdcall CConnSink::Release(void)
{ return 0; }
STDMETHODIMP CConnSink::GetTypeInfoCount(unsigned int *)
{ return E_NOTIMPL; }
STDMETHODIMP CConnSink::GetTypeInfo(unsigned int,unsigned long,struct ITypeInfo ** )
{ return E_NOTIMPL; }
STDMETHODIMP CConnSink::GetIDsOfNames(const IID &,LPOLESTR *,UINT,LCID,DISPID *)
{ return E_NOTIMPL; }
STDMETHODIMP CConnSink::Invoke(
long dispID,
const struct _GUID &,
unsigned long,
unsigned short,
struct tagDISPPARAMS * pParams,
struct tagVARIANT *,
struct tagEXCEPINFO *,
unsigned int *)
{
switch(dispID)
{
case 1:
if(mti!=0 && pParams->cArgs==1 && pParams->rgvarg->vt==VT_BSTR){
ConnMsg *c />
connMsg->c />
connMsg->data=pParams->rgvarg->bstrVal;
PostThreadMessage(mti,WM_SDMSG,0,(LPARAM)connMsg);
}
break;
default:
break;
}
return S_OK;
}
连接代码
lpDisp->Release();
LPCONNECTIONPOINT pConnPt;
hr=pConnPtCont->FindConnectionPoint(DIID__IEComEvents,&pConnPt);
if(FAILED(hr))
{
m_conn->Release();
pConnPtCont->Release();
return 0;
}
pConnPtCont->Release();
//
COMM_STRUCT *pcs=new COMM_STRUCT;
pcs->m_c />
pcs->m_ref=1;
pcs->C />
LPDISPATCH lpSink;
pcs->ConnSink->QueryInterface(IID_IDispatch,(void**)&lpSink);
pcs->ConnSink->c />
hr=pConnPt->Advise(lpSink,&pcs->dwCookie);
if(FAILED(hr))
{
delete pcs->ConnSink;
delete pcs;
pConnPt->Release();
m_conn->Release();
return 0;
}