Reviewing our code I've found a curious definition in one of .idl files:
[
object,
uuid(uuidhere),
dual,
nonextensible,
oleautomation,
hidden
]
interface IOurInterface : IUnknown {
//methods here
};
How can an interface derived directly from IUnknown
possibly be a dual interface? Will anything break if I remove the dual
attribute?
In this answer to another question concerning marshaling user voyce points to this article that basically states the following:
When any interface (IDispatch-derived or not) is marked either
dual
oroleautomation
(or both) it is treated specially whenRegisterTypeLib()
is invoked (which is typically done by DllRegisterServer). For each such interface an HKCR\Interface{InterfaceId} key is created under which {00020424-0000-0000-C0000-000000000046} class is referenced as proxy/stub. This class id corresponds to typelib marshaller also known as oleautomation marshaller.I can't see a reason that that would work, given the docs here: http://msdn.microsoft.com/en-us/library/aa366807(VS.85).aspx
It could be that the
[dual]
attribute implicitly addsIDispatch
to the interface.What you could do is check the code implementing the interface (assuming this is ATL) if it derives from
IDispatchImpl
. If so, it actually responds to QI forIDispatch
and might be used as such.Another alternative is to instantiate an object implementing
IOurInterface
and QI it forIDispatch
-- if it succeeds, you probably can't remove it.Actually, come to think of it, maybe
[dual]
doesn't technically require that you derive fromIDispatch
as long as you implement both your custom interface andIDispatch
?