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

浙公网安备 33010602011771号