DirectShow Animated Header -- INonDelegatingUnknown Interface DirectShow Animated Header -- INonDelegatingUnknown Interface* Microsoft DirectShow SDK
*Index  *Topic Contents
*Previous Topic: IUnknown Macro
*Next Topic: Math Helper Functions

INonDelegatingUnknown Interface


To enable a class to support both nondelegating and delegating IUnknown interfaces in the same COM object, the Combase.h header file declares the INonDelegatingUnknown interface. This interface is a version of IUnknown and has three methods:
INonDelegatingUnknown::NonDelegatingQueryInterface
INonDelegatingUnknown::NonDelegatingAddRef
INonDelegatingUnknown::NonDelegatingRelease

For sample implementations of these methods, see CUnknown::NonDelegatingQueryInterface, CUnknown::NonDelegatingAddRef, and CUnknown::NonDelegatingRelease.


INonDelegatingUnknown

INonDelegatingUnknown Interface

A version of IUnknown renamed to enable a class to support both nondelegating and delegating IUnknown interfaces in the same COM object. The interface supports the following three methods, in vtable order:

HRESULT NonDelegatingQueryInterface(
  REFIID iid,
  void** ppvObject );

ULONG NonDelegatingAddRef(void);

ULONG NonDelegatingRelease(void);

Remarks

To use INonDelegatingUnknown for multiple inheritance, perform the following steps:

  1. Derive your class from an interface, for example, IMyInterface.
  2. Include DECLARE_IUNKNOWN in your class definition to declare implementations of QueryInterface, AddRef, and Release that call the outer unknown.
  3. Override NonDelegatingQueryInterface to expose IMyInterface with code such as the following:
    
         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. Declare and implement the member functions of IMyInterface.

To use INonDelegatingUnknown for nested interfaces, perform the following steps:

  1. Declare a class derived from CUnknown.
  2. Include DECLARE_IUNKNOWN in your class definition.
  3. Override NonDelegatingQueryInterface to expose IMyInterface with the code such as the following:
    
         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. Implement the member functions of IMyInterface. Use CUnknown::GetOwner to access the COM object class.
  5. In your COM object class, make the nested class a friend of the COM object class, and declare an instance of the nested class as a member of the COM object class.

    Because you must always pass the outer unknown and an HRESULT to the CUnknown constructor, you can't use a default constructor. You have to make the member variable a pointer to the class and make a new call in your constructor to actually create it.

  6. Override the NonDelegatingQueryInterface with code such as the following:
    
    
         if (riid == IID_IMyInterface) {
             return m_pImplFilter->
                NonDelegatingQueryInterface(IID_IMyInterface, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    

You can have mixed classes that support some interfaces through multiple inheritance and some interfaces through nested classes.

See Also

GetInterface, CUnknown, IUnknown Macro

© 1998 Microsoft Corporation. All rights reserved. Terms of Use.

*Top of Page