如何使用 Visual C++ 覆寫 MFC 應用程式中的介面

文章翻譯 文章翻譯
文章編號: 141277 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
附註Microsoft Visual C++ NET (2002) 支援.NET Framework 與不受管理的原生 Windows 所提供的兩個受管理的程式碼模型的程式碼模型。在本文資訊適用於不受管理的 Visual C++ 程式碼只。

附註Microsoft Visual C++ 2005年支援.NET Framework 與不受管理的原生 Windows 所提供的兩個受管理的程式碼模型的程式碼模型。
全部展開 | 全部摺疊

結論

在 MFC 應用程式中您可以覆寫現有類別中的介面,以及提供其他的介面。覆寫介面在這種情況下是等於與取代介面。本文中的範例說明如何同時保留原始的介面實作,讓它可以由新的介面實作委派到會覆寫類別中的介面。

因為這是一種特殊情況,本文不會處理與覆寫 IDispatch 的實作。如更多有關如何覆寫 IDispatch 在 MFC 中,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
140616取代 MFC IDispatch 實作

其他相關資訊

下列步驟將會覆寫 [IOleObject 預設 OLE 控制項 [控制項精靈所產生的實作。

  1. 若要加入至控制項的 IOleObject 實作宣告,將下列程式碼新增至 COleControl 衍生類別的標頭檔:
          // Interface Maps
          protected:
               // IOleObject
               BEGIN_INTERFACE_PART(MyOleObject, IOleObject)
                   INIT_INTERFACE_PART(CIOleOverCtrl, MyOleObject)
                   STDMETHOD(SetClientSite)(LPOLECLIENTSITE);
                   STDMETHOD(GetClientSite)(LPOLECLIENTSITE*);
                   STDMETHOD(SetHostNames)(LPCOLESTR, LPCOLESTR);
                   STDMETHOD(Close)(DWORD);
                   STDMETHOD(SetMoniker)(DWORD, LPMONIKER);
                   STDMETHOD(GetMoniker)(DWORD, DWORD, LPMONIKER*);
                   STDMETHOD(InitFromData)(LPDATAOBJECT, BOOL, DWORD);
                   STDMETHOD(GetClipboardData)(DWORD, LPDATAOBJECT*);
                   STDMETHOD(DoVerb)(LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND,
                           LPCRECT);
                   STDMETHOD(EnumVerbs)(IEnumOLEVERB**);
                   STDMETHOD(Update)();
                   STDMETHOD(IsUpToDate)();
                   STDMETHOD(GetUserClassID)(CLSID*);
                   STDMETHOD(GetUserType)(DWORD, LPOLESTR*);
                   STDMETHOD(SetExtent)(DWORD, LPSIZEL);
                   STDMETHOD(GetExtent)(DWORD, LPSIZEL);
                   STDMETHOD(Advise)(LPADVISESINK, LPDWORD);
                   STDMETHOD(Unadvise)(DWORD);
                   STDMETHOD(EnumAdvise)(LPENUMSTATDATA*);
                   STDMETHOD(GetMiscStatus)(DWORD, LPDWORD);
                   STDMETHOD(SetColorScheme)(LPLOGPALETTE);
               END_INTERFACE_PART(MyOleObject)
    
          DECLARE_INTERFACE_MAP();
    						
    這將巢狀的類別 XMyOleObject 加入至您控制項類別。請注意這些巨集宣告介面方法包括 IUnknown 介面方法,因此您必須實作 IUnknown 方法。
  2. 加入至控制項的介面對應的 IOleObject 介面,將 INTERFACE_PART 巨集加入至控制項的實作檔:
          BEGIN_INTERFACE_MAP(CIOleOverCtrl, COleControl)
             INTERFACE_PART(CIOleOverCtrl, IID_IOleObject, MyOleObject)
          END_INTERFACE_MAP()
    						
    取代 CIOleOverCtrl 具有您所選擇之巢狀類別的支援 IOleObject 名稱的控制項和 MyOleObject 名稱。
  3. 實作您宣告的介面方法。將下列程式碼加入至控制項的實作檔:
          STDMETHODIMP_(ULONG) CIOleOverCtrl::XMyOleObject::AddRef()
          {
              METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
              ASSERT_VALID(pThis);
    
              return pThis->m_xOleObject.AddRef();
          }
    
          STDMETHODIMP_(ULONG) CIOleOverCtrl::XMyOleObject::Release()
          {
              METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
              ASSERT_VALID(pThis);
    
              return pThis->m_xOleObject.Release ();
          }
    
          STDMETHODIMP CIOleOverCtrl::XMyOleObject::QueryInterface(
              REFIID iid, LPVOID far* ppvObj)
          {
              METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
              ASSERT_VALID(pThis);
    
              return pThis->m_xOleObject.QueryInterface ( iid,  ppvObj);
          }
    
          STDMETHODIMP
          CIOleOverCtrl::XMyOleObject::SetClientSite(LPOLECLIENTSITE
          pClientSite)
          {
              METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
                 ASSERT_VALID(pThis);
    
              return pThis->m_xOleObject.SetClientSite ( pClientSite );
          }
          ...
其餘的方法遵循相同模式,其中 CIOleOverCtrl 是控制項的名稱、 XMyOleObject 是支援 IOleObject,該巢狀類別的名稱而 m_xMyOleObject 的計算方式是從介面所支援,並加入 m_x 移除我。

請注意這些方法只是傳遞呼叫上的原始 IOleObject 實作。不過,這不是需求 ; 您可以新增功能,並委派原始實作或不委派。

?考

技術注意事項 # 38 和 # 39。

屬性

文章編號: 141277 - 上次校閱: 2014年3月1日 - 版次: 3.1
這篇文章中的資訊適用於:
  • Microsoft Foundation Class Library 4.2?應用於:
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
    • Microsoft Visual C++ 2005 Express Edition
關鍵字:?
kbnosurvey kbarchive kbmt kbarchitecture kbctrl kbhowto KB141277 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:141277
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com