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