共用方式為


INonDelegatingUnknown

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

介面 INonDelegatingUnknown 是已重新命名的 IUnknown 版本,可啟用對相同 COM 物件中非委派和委派 IUnknown 介面的支援。

語法

interface INonDelegatingUnknown
{
    virtual HRESULT NonDelegatingQueryInterface(REFIID riid, LPVOID *ppv) PURE;
    virtual ULONG NonDelegatingAddRef(void) PURE;
    virtual ULONG NonDelegatingRelease(void) PURE;
};

備註

若要用於 INonDelegatingUnknown 多重繼承,請執行下列步驟。

  1. 從介面衍生您的類別,例如 IMyInterface。

  2. 在您的類別定義中包含 DECLARE_IUNKNOWN ,以宣告呼叫外部未知之 QueryInterfaceAddRefRelease 的實作。

  3. 覆寫 NonDelegatingQueryInterface 以使用下列程式碼公開 IMyInterface:

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. 宣告並實作 IMyInterface 的成員函式。

INonDelegatingUnknown若要用於巢狀介面,請執行下列步驟:

  1. 宣告衍生自 CUnknown 的類別。

  2. 在您的類別定義中包含 DECLARE_IUNKNOWN

  3. 覆寫 NonDelegatingQueryInterface 以使用下列程式碼公開 IMyInterface:

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. 實作 IMyInterface 的成員函式。 使用 CUnknown::GetOwner 來存取 COM 物件類別。

  5. 在您的 COM 物件類別中,將巢狀類別設為 COM 物件類別的 Friend,並將巢狀類別的實例宣告為 COM 物件類別的成員。

因為您必須一律將外部未知和 HRESULT 傳遞至 CUnknown 建構函式,所以您無法使用預設建構函式。 您必須讓成員變數成為類別的指標,並在建構函式中建立新的呼叫,才能實際建立它。

以下列程式碼 覆寫 NonDelegatingQueryInterface

     if (riid == IID_IMyInterface) {
         return m_pImplFilter->
            NonDelegatingQueryInterface(IID_IMyInterface, ppv);
     } else {
         return CUnknown::NonDelegatingQueryInterface(riid, ppv);
     }

您可以有混合類別,可透過多重繼承支援某些介面,以及透過巢狀類別支援某些介面。

規格需求

需求
標頭
Combase.h (包含 Streams.h)
程式庫
Strmbase.lib (零售組建) ;
Strmbasd.lib (偵錯組建)

另請參閱

COM 協助程式函式