ATL接收事件 非ActiveX控件

使用IDispEventImpl或IDispEventSimpleImpl
对于IDispEventSimpleImpl,需要准备一个IDispEventImpl数据结构,并且用SINK_ENTRY_INFO
对于IDispEventImpl,需要指定lib,版本号等信息。用宏SINK_ENTRY_EX
----------------------------------------------------------------------------------

#define LIBRARY_MAJOR   1
#define LIBRARY_MINOR   0

class CDriver : 
	public CComObjectRoot,
	public IDispEventImpl<0, CDriver, &__uuidof(_IMyTestEvents), &LIBID_ATL3Lib, LIBRARY_MAJOR, LIBRARY_MINOR> 
//	public IDispEventSimpleImpl<0, CDriver, &__uuidof(_IMyTestEvents)>
{
public:
	static _ATL_FUNC_INFO OnOKInfo;
	CDriver() {}

	BEGIN_COM_MAP(CDriver)
	END_COM_MAP()

	BEGIN_SINK_MAP(CDriver)
		SINK_ENTRY_EX(0, __uuidof(_IMyTestEvents), 1, On_OK)
//		SINK_ENTRY_INFO(0, __uuidof(_IMyTestEvents), 1, On_OK,&OnOKInfo)
	END_SINK_MAP()

	HRESULT __stdcall On_OK()
	{
		MessageBox(NULL,_T("On_OK"),_T("Sink"),MB_OK);
		return 0L;
	}

};

_ATL_FUNC_INFO CDriver::OnOKInfo    = {CC_STDCALL, VT_EMPTY, 0, { VT_BSTR }};

----------------------------------------------------------------------------------
使用

		::CoInitialize( NULL );		// 如果在这里进行 COM 初始化,要注意智能指针的释放

		CComQIPtr <IMyTest> spFun;
		HRESULT hr = spFun.CoCreateInstance( __uuidof(MyTest));
		ATLASSERT( SUCCEEDED( hr ) );

		CComObject<CDriver>* ptrMathEvents;
		CComObject<CDriver>::CreateInstance( &ptrMathEvents );

		ptrMathEvents->DispEventAdvise(spFun,&__uuidof(_IMyTestEvents));

//		AtlAdvise(spFun, (IUnknown*)ptrMathEvents, DIID__IMyTestEvents, &m_dwEventCookie);

		spFun->Foo();
		
	//	spFun->Release();	// 大错特错!!!
		spFun.Release();	// 正解

		::CoUninitialize();

转载于:https://www.cnblogs.com/fanzi2009/archive/2010/05/07/1729517.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值