1 // Sink.h : Declaration of the CSink 2 3 #ifndef __SINK_H_ 4 #define __SINK_H_ 5 6 #include "resource.h" // main symbols 7 #include "sinktbl.h" 8 9 #define EVENT_HANDLER_TBL_SIZE (93) 10 11 typedef struct _event_handler_entry_ { // entry in hash table 12 DISPID dispId; 13 void *handler; 14 _event_handler_entry_ *next; 15 } EVENT_HANDLER_ENTRY; 16 17 ///////////////////////////////////////////////////////////////////////////// 18 // CSink 19 class ATL_NO_VTABLE CSink : 20 public CComObjectRootEx<CComSingleThreadModel>, 21 public CComCoClass<CSink, &CLSID_Sink>, 22 public IDispatchImpl<ISink, &IID_ISink, &LIBID_MYSSINKLib> 23 { 24 25 private: 26 MYSSINK_TABLE *myssink_table; 27 28 void *variantToSchemeObject(VARIANTARG *); 29 void unmarshalSchemeObject(void *,VARIANTARG *); 30 void handlerUpdateError(char *); 31 32 unsigned int getHashValue(DISPID); 33 EVENT_HANDLER_ENTRY *newEventHandlerEntry(DISPID,void *); 34 EVENT_HANDLER_ENTRY *lookupHandler(DISPID); 35 36 EVENT_HANDLER_ENTRY eventHandlerTable[EVENT_HANDLER_TBL_SIZE]; 37 38 public: 39 CSink(); 40 ~CSink(); 41 42 DECLARE_REGISTRY_RESOURCEID(IDR_SINK) 43 44 DECLARE_PROTECT_FINAL_CONSTRUCT() 45 46 BEGIN_COM_MAP(CSink) 47 COM_INTERFACE_ENTRY(ISink) 48 COM_INTERFACE_ENTRY(IDispatch) 49 END_COM_MAP() 50 51 // ISink 52 public: 53 STDMETHOD(set_myssink_table)(void *); 54 STDMETHOD(register_handler)(DISPID,void *); 55 STDMETHOD(unregister_handler)(DISPID); 56 57 //override ATL implementations 58 59 STDMETHOD(Invoke)(DISPID,REFIID,LCID,WORD, 60 DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*); 61 62 STDMETHOD(InternalQueryInterface)(void *, const _ATL_INTMAP_ENTRY* pEntries,REFIID,void **); 63 }; 64 65 #endif //__SINK_H_ 66 67