纯C++类接收ATL连接点事件

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_MODULE
CComModule _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();
		}
		else
			return 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++,脚本,null,Class,语言,interface)