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;
}

本文介绍了如何在纯C++项目中利用ATL的连接点功能,简化了在C++中通常需要手动实现IDispatch接口的复杂过程。通过定义接收器模板类基类和具体实现类,以及提供测试代码,展示了在C++工程中方便地使用ATL连接点进行组件与客户端通信的方法。
8063

被折叠的 条评论
为什么被折叠?



