使用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 spFun;
HRESULT hr = spFun.CoCreateInstance( __uuidof(MyTest));
ATLASSERT( SUCCEEDED( hr ) );
CComObject* ptrMathEvents;
CComObject::CreateInstance( &ptrMathEvents );
ptrMathEvents->DispEventAdvise(spFun,&__uuidof(_IMyTestEvents));
// AtlAdvise(spFun, (IUnknown*)ptrMathEvents, DIID__IMyTestEvents, &m_dwEventCookie);
spFun->Foo();
// spFun->Release(); // 大错特错!!!
spFun.Release(); // 正解
::CoUninitialize();