纯C++类接收ATL连接点事件
来源:互联网 发布:淘宝网集市怎么开通 编辑:程序博客网 时间:2024/06/16 04:42
ATL中的连接点提供了组件与客户端相互通信的渠道,连接点在脚本语言中使用比较方便,但在C++中使用一般要自己实现IDispatch相关接口函数,使用起来很不方便,本文介绍在一般的C++工程中使用ATL,创建Sink的方式
一、定义接收器模板类基类
CppConnectionPointSink.h
#ifndef __CPP_CONNECTIONPOINT_SINK_H__#define __CPP_CONNECTIONPOINT_SINK_H__#include <atlbase.h>#include <atlcom.h>template<class T, class _TIEvent, UINT _ID>class CCppConnectionPointSink :public IDispatchImpl<_TIEvent>,public CComObjectRoot,public IDispEventSimpleImpl<_ID, T, &__uuidof(_TIEvent)>{BEGIN_COM_MAP(T)COM_INTERFACE_ENTRY(IDispatch)COM_INTERFACE_ENTRY(_TIEvent)END_COM_MAP()};#endif
二、实现接收器类
SinkAddResult.h
#pragma once#include "CppConnectionPointSink.h"extern _ATL_FUNC_INFO AddResultInfo;class CSinkAddResult : public CCppConnectionPointSink<CSinkAddResult, _ICalcEvents, 1>{public:CSinkAddResult(void);~CSinkAddResult(void);BEGIN_SINK_MAP(CSinkAddResult)SINK_ENTRY_INFO(/*nID = */1, __uuidof(_ICalcEvents), /*dispid =*/ 1, OnAddResult, &AddResultInfo)END_SINK_MAP()void __stdcall OnAddResult(long nVal);};
SinkAddResult.cpp
#include "StdAfx.h"#include "SinkAddResult.h"#ifndef __CPP_CONNECTIONPOINT_SINK_HAS_ATL_MODULE#define __CPP_CONNECTIONPOINT_SINK_HAS_ATL_MODULECComModule _Module;#endif_ATL_FUNC_INFO AddResultInfo = {CC_STDCALL, VT_EMPTY, 1, {VT_I4}};CSinkAddResult::CSinkAddResult(void){}CSinkAddResult::~CSinkAddResult(void){}void __stdcall CSinkAddResult::OnAddResult(long nVal){cout << "CSinkAddResult::OnAddResult : " << nVal << endl;}
三、测试代码
/ TestConnPoint.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "SinkAddResult.h"int _tmain(int argc, _TCHAR* argv[]){::CoInitialize(NULL);try{ICalcPtr pCalc(__uuidof(ConnectionPointLib::Calc));CComObject<CSinkAddResult>* pSinkAddResult;//创建接收器对象CComObject<CSinkAddResult>::CreateInstance(&pSinkAddResult);IUnknownPtr pUnk(pCalc);//注册事件HRESULT hr = pSinkAddResult->DispEventAdvise(pUnk, &__uuidof(_ICalcEvents));if (SUCCEEDED(hr)){pSinkAddResult->AddRef();}elsereturn 1;//Add将触发AddResult事件pCalc->Add(10, 20);//去注册事件pSinkAddResult->DispEventUnadvise(pUnk, &__uuidof(_ICalcEvents));}catch (_com_error& e){}::CoUninitialize();return 0;}
源代码:http://download.csdn.net/detail/txk1452/4349431
- 纯C++类接收ATL连接点事件
- ATL连接点事件(ConnectionPoint)
- (ZT)ATL:连接点及接收事件的两种方法
- C++调用ATL事件连接点
- vs2013 ATL 工程 添加连接点事件
- ATL中手工添加连接点事件的方法 【转】
- vs2008 ATL 连接点
- ATL提供了两个关于事件连接点的helper函数
- 在连接点中设置传入参数时出错,怎么办?【ATL事件】
- (转)ATL连接点开发总结
- 在ATL中接收事件(AtlAdvise 和 AtlUnadvise的使用)
- ATL提供了两个关于事件连接点的helper函数,我们拿来可以放心用了。
- ATL中连接到连接点对象的实现
- ATL中连接到连接点对象的实现
- ATL-连接点和接口方法的使用
- COM 连接点事件讲解
- COM 连接点事件 转
- com连接点事件浅析
- Ajax.PeriodicalUpdater
- mmsplayer V2.0 近期发布
- 俞敏洪在2008年北大开学典礼的演讲
- 为什么移动计算比移动数据更便宜?
- 99乘法表
- 纯C++类接收ATL连接点事件
- Source Insight技巧收集
- sql游标的使用详细教程
- Cocos2d-html5 Alpha发布了!!!
- 74天
- asp.net好的网站
- 关于JS中的constructor与prototype .
- C++程序设计实验报告(七十九)---第十六周任务一
- MySQL体系结构和存储引擎