实时接收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);//注册其接收接口指针
相关文章推荐
- vc6 0 atl工程开发的com组件输出事件到VB,VB接收不到中件响应
- extjs组件添加事件监听的三种方式 http://blog.sina.com.cn/s/blog_48d7f92901011cfn.html
- 在VC++程序中接收COM事件
- 【转载】COM 组件设计与应用(十三)——事件和通知(VC6.0)
- 在VC++程序中接收COM事件
- Vue2.0父组件与子组件之间的事件发射与接收实例代码
- 【转载】COM 组件设计与应用(十四)——事件和通知(vc.net)
- 在VC++程序中接收COM事件
- COM 组件设计与应用(十三)——事件和通知(VC6.0)
- COM 组件实现事件、通知
- COM 组件设计与应用(十四)——事件和通知(vc.net)
- 封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集),实现 "邮件(附件) 到达" 等 "事件,c#接收邮件
- 在VC++程序中接收COM事件[转贴]
- 封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集),实现 "邮件(附件) 到达" 等 "事件,c#接收邮件
- Vue父组件接收不到子组件$emit事件的原因分析
- atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系
- 关于Delphi 下indy Telnet 组件生成com的问题
- Google Maps Api V3 鼠标事件监听及实时显示当前的经纬度
- 如何让Form窗体接收keydown事件
- 如何注册.net 的类库dll 为com组件