您的位置:首页 > 其它

实时接收com组件抛出的事件

2014-12-16 14:49 656 查看
一、找到事件对用的DISPID

二、添加委托类

#pragmaonce
#include"oaidl.h"
#include<WinUser.h>
#include"testEventCtrl.h"
#defineWM_NEWUSER4
#defineWM_CONNECT6

classSkin:
publicIDispatch
{
public:
Skin(void);
~Skin(void);

CtestEventCtrl*pCtrl;

STDMETHODIMPSkin::QueryInterface(conststruct_GUID&iid,void**ppv)
{
*ppv=this;
returnS_OK;
}

ULONG__stdcallSkin::AddRef(void)
{return1;}//做个假的就可以,因为反正这个对象在程序结束前是不会退出的

ULONG__stdcallSkin::Release(void)
{return0;}//做个假的就可以,因为反正这个对象在程序结束前是不会退出的

STDMETHODIMPSkin::GetTypeInfoCount(unsignedint*)
{returnE_NOTIMPL;}//不用实现,反正也不用

STDMETHODIMPSkin::GetTypeInfo(unsignedint,unsignedlong,structITypeInfo**)
{returnE_NOTIMPL;}//不用实现,反正也不用

STDMETHODIMPSkin::GetIDsOfNames(constIID&,LPOLESTR*,UINT,LCID,DISPID*)
{returnE_NOTIMPL;}//不用实现,反正也不用

STDMETHODIMPSkin::Invoke(
longdispID,
conststruct_GUID&,
unsignedlong,
unsignedshort,
structtagDISPPARAMS*pParams,
structtagVARIANT*,
structtagEXCEPINFO*,
unsignedint*)
{//只需要实现这个就足够啦
switch(dispID)//根据不同的dispID,完成不同的回调函数
{
case4:
{
VARIANTvarlValue;
longlValue=0;
varlValue=(pParams->rgvarg)[0];
lValue=V_I4(&varlValue);

::PostMessage(pCtrl->m_hWnd,WM_NEWUSER,NULL,lValue);
}
break;
case6:

::PostMessage(pCtrl->m_hWnd,WM_CONNECT,NULL,NULL);
break;

default:
break;
}
returnS_OK;
}

};


三、控制类中接收派发的消息

BEGIN_MESSAGE_MAP(CtestEventCtrl,COleControl)
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES,OnProperties)
ON_MESSAGE(WM_NEWUSER,OnNewUser)
ON_MESSAGE(WM_CONNECT,OnConnect)
END_MESSAGE_MAP()


四、查找连接点
IZKEMPtrm_ZkFace;

HRESULThr=S_OK;
hr=m_ZkFace.CreateInstance(__uuidof(CZKEM));

if(hr==S_FALSE)
{
AfxMessageBox(_T("初始化失败!"));
return-1;
}

IConnectionPointContainer*pCPC;
hr=m_ZkFace->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPC);
if(!SUCCEEDED(hr))
{
return-1;
}
IConnectionPoint*pCP;
constIIDiIID=__uuidof(_IZKEMEvents);
hr=pCPC->FindConnectionPoint(iIID,&pCP);
//获取连接点
if(!SUCCEEDED(hr))
{
return-1;
}
pCPC->Release();

IUnknown*pSinkUnk;
Skin*pSink=newSkin();
pSink->pCtrl=this;
hr=pSink->QueryInterface(IID_IUnknown,(void**)&pSinkUnk);
DWORDdwAdvise;
hr=pCP->Advise(pSinkUnk,&dwAdvise);//注册其接收接口指针

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: