纯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

原创粉丝点击