现在的位置: 首页 > 综合 > 正文

ATL接收事件 非ActiveX控件

2011年01月21日 ⁄ 综合 ⁄ 共 1395字 ⁄ 字号 评论关闭

使用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();

抱歉!评论已关闭.