Multiple Dual Interfaces
For the latest documentation on Visual Studio 2017, see Visual Studio 2017 Documentation.
You may want to combine the advantages of a dual interface (that is, the flexibility of both vtable and late binding, thus making the class available to scripting languages as well as C++) with the techniques of multiple inheritance.
Although it is possible to expose multiple dual interfaces on a single COM object, it is not recommended. If there are multiple dual interfaces, there must be only one
IDispatch interface exposed. The techniques available to ensure that this is the case carry penalties such as loss of function or increased code complexity. The developer considering this approach should carefully weigh the advantages and disadvantages.
It is possible to expose multiple dual interfaces on a single object by deriving from two or more specializations of
IDispatchImpl. However, if you allow clients to query for the
IDispatch interface, you will need to use the COM_INTERFACE_ENTRY2 macro (or COM_INTERFACE_ENTRY_IID) to specify which base class to use for the implementation of
Because only one
IDispatch interface is exposed, clients that can only access your objects through the
IDispatch interface will not be able to access the methods or properties in any other interface.
ATL does not provide any support for combining multiple dual interfaces into a single implementation of
IDispatch. However, there are several known approaches to manually combining the interfaces, such as creating a templated class that contains a union of the separate
IDispatch interfaces, creating a new object to perform the
QueryInterface function, or using a typeinfo-based implementation of nested objects to create the
These approaches have problems with potential namespace collisions, as well as code complexity and maintainability. It is not recommended that you create multiple dual interfaces.