Re: Default Implementation for IUnknown
Yes you can. Something like this:
class MySink : public IDispEventSimpleImpl<0, MySink, &IID_IDispatch> {
typedef IDispEventSimpleImpl<0, MySink, &IID_IDispatch> BaseClass;
public:
BEGIN_SINK_MAP(MySink)
SINK_ENTRY_INFO(0, IID_IDispatch, DISPID_VALUE, OnEvent,
&EventInfo)
END_SINK_MAP()
// |event| implements IHTMLEventObj[2|3|4]
// return VARIANT_FALSE to cancel defaul action, VARIANT_TRUE to
allow
VARIANT_BOOL STDMETHODCALLTYPE OnEvent(IDispatch* event);
// Suitable for passing to attachEvent
IDispatch* GetIDispatch() {
return
reinterpret_cast<IDispatch*>(static_cast<BaseClass*>(this));
}
private:
static _ATL_FUNC_INFO EventInfo;
};
// In .cpp file
_ATL_FUNC_INFO MySink::EventInfo = {
CC_STDCALL, VT_BOOL, 1, {VT_DISPATCH}
};
No I tried it using the input of Alexander and some other sources as
well. It looks like that:
class ATL_NO_VTABLE DOMEventHandler :
public IDispEventImpl<1, DOMEventHandler, &DIID_HTMLElementEvents2,
&LIBID_MSHTML, 1, 1>
{
typedef IDispEventImpl<1, DOMEventHandler, &DIID_HTMLElementEvents2,
&LIBID_MSHTML, 1, 1> BaseClass;
protected:
long m_dwRef;
public:
DOMEventHandler(void) {}
virtual ~DOMEventHandler(void) {}
void STDMETHODCALLTYPE OnClick(IHTMLEventObj *pEvtObj);
BEGIN_COM_MAP(DOMEventHandler)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
BEGIN_SINK_MAP(DOMEventHandler)
SINK_ENTRY_EX(1, DIID_HTMLElementEvents2,
DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnClick)
END_SINK_MAP()
ULONG InternalAddRef() { return AddRef(); }
ULONG InternalRelease() { return Release(); }
void FinalRelease() {}
};
Unfortunatly, this doesn't compile. I get the message that 'Lock',
'Unlock' and 'InternalQueryInterface' are not a member of
DOMEventHandler but I don't know what these methods are supposed to
do. Without the COM_MAP I also get error messages because the object
is used as follows:
CComObject<DOMEventHandler>* pDEH;
hr = CComObject<DOMEventHandler>::CreateInstance(&pDEH);
CHECK_OK(hr);
pDEH->AddRef();
pDEH->DispEventAdvise(pDocument);
VARIANT v;
v.vt = VT_DISPATCH;
v.pdispVal = (IDispatch*) pDEH;
Thus, I get the error that '_InternalQueryInterface' was not found
which is why I added the COM_MAP in the first place (but that in turn
lead to the problems mentioned above).
Any hints?
Thanks,
Stefan