Make Added Interfaces Available Through NonDelegatingQueryInterface (Windows Embedded CE 6.0)
1/6/2010
Only filters which add interfaces that are not in the base classes, such as those required for creating property pages, need to implement the IUnknown member functions (called INonDelegatingUnknown in the base classes).
The base classes provide default implementations of the IUnknown methods. IUnknown methods in any COM-based code retrieve interfaces from an object, and increment and decrement the reference counts of those interfaces. For example, the IUnknown::QueryInterface method retrieves interfaces from an object.
DirectShow defines a special IUnknown class called INonDelegatingUnknown, whose methods do the same thing as IUnknown. (The reason for the name change is so that objects can be aggregated.)
The NonDelegatingQueryInterface method is called whenever some object or application wants to query a pin or filter for any interfaces it implements.
If your filter implements any interface outside those listed in the base class implementation, override the NonDelegatingQueryInterface method to return a pointer to the implemented interface.
For example, the following code example overrides the member function to distribute references to the ISpecifyPropertyPages:IUnknown and IPersistStream interfaces.
// Reveal our persistent stream, property pages, and IGargle interfaces.
STDMETHODIMP CGargle::NonDelegatingQueryInterface(REFIID riid, void **ppv) {
if (riid == IID_IGargle) {
return GetInterface((IGargle *) this, ppv);
} else if (riid == IID_ISpecifyPropertyPages) {
return GetInterface((ISpecifyPropertyPages *) this, ppv);
} else if (riid == IID_IPersistStream) {
AddRef(); // add a reference count to ourselves
*ppv = (void *)(IPersistStream *)this;
return NOERROR;
} else {
return CTransInPlaceFilter::NonDelegatingQueryInterface(riid, ppv);
}
} // NonDelegatingQueryInterface
Note
This sample calls the CTransInPlaceFilter implementation of the member function to finish up.