Re: Default Implementation for IUnknown
Stefan Weber <stefan.weber@gmail.com> wrote:
Now, I'm sticking to yours as well and have the
folloing event sink:
class ATL_NO_VTABLE DOMEventHandler :
public IDispEventImpl<1, DOMEventHandler, &DIID_HTMLElementEvents2,
&LIBID_MSHTML, 1, 1> {
A callback object usable with attachEvent is completely different from
an event sink attached with the connection point. The latter does need
to implement DIID_HTMLElementEvents2 and handle events with various
DISPIDs like DISPID_HTMLELEMENTEVENTS2_ONCLICK. The former does not and
does not. Its Invoke implementation is only ever called with a DISPID of
DISPID_VALUE.
Since the callback does not implement any particular named
dispinterface, there is no suitable definition in any available TLB, and
thus IDispEventImpl cannot be used. That's why I use
IDispEventSimpleImpl and manually describe the expected method
signature.
I've actually wrote a sample and tested my code. It works for me. The
only change I had to make is to remove IDispatch* parameter (both from
the OnEvent prototype and from EventIno), since you are now using
put_onclick and not attachEvent as you suggested earlier.
This is how I attach the sink:
CComPtr<IHTMLElement> spElem = /* initialized somehow */;
MySink* pSink = new MySink;
IDispatch* pSinkDisp = pSink->GetIDispatch();
spElem->put_onclick(CComVariant(pSinkDisp));
This code eventually leaks MySink instance: for the purposes of the
sample, I didn't bother to delete it during shutdown. You may want to be
more careful. Be aware that IDispEvent[Simple]Impl provides a fake
implementation of AddRef and Release that just return without doing
anything. In other words, this sink object is _not_ reference counted,
you must explicitly delete it once you no longer need it. Or,
alternatively, implement AddRef and Release so it deletes itself.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925