Re: Default Implementation for IUnknown
Stefan Weber <stefan.weber@gmail.com> wrote:
Why don't you just derive from IDispEvent[Simple]Impl?
Will try that, thank you.
They already
provide a suitable IUnknown implementation. No need for
CComObjectRootEx or IDispatch, and you get to use a sink map instead
of manually implementing a switch in Invoke. Parameter parsing and
coercion is also performed for you.
I need it for handling events registered in the browser's DOM. The
attachEvent method expects an IDispatch interface pointer and uses
Invoke as a callback.
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}
};
--
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