Jak lze přepsat pomocí Visual C++ rozhraní v aplikaci MFC

Překlady článku Překlady článku
ID článku: 141277 - Produkty, které se vztahují k tomuto článku.
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Poznámka: Microsoft Visual C++ NET (2002) podporované obou spravovaný kód model, který poskytl .NET Framework a Nespravovaná nativní Windows modelu kódu. Informace v tomto článku platí Nespravovaná Visual C++ pouze kód.

Poznámka: Microsoft Visual C++ 2005 podporováno obou spravovaný kód model, který poskytl .NET Framework a Nespravovaná nativní Windows modelu kódu.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Souhrn

Aplikace MFC, můžete přepsat existující rozhraní třídy stejně jako poskytují další rozhraní. Přepsání rozhraní v tomto případě prvku je totožná s nahrazení rozhraní. Příklad v tomto článku ukazuje jak přepsat rozhraní v třídě při zachování původní implementaci rozhraní, takže může být delegován podle nové implementace rozhraní.

Tento článek není zacházet s přepsání implementace IDispatch jako Toto je zvláštní případ. Další informace o přepsat IDispatch MFC klepnutím na následující číslo článku databáze Microsoft Knowledge Base:
140616Nahrazení implementace MFC IDispatch

Další informace

Následující kroky IOleObject přepíší implementaci výchozí OLE ovládací generovaný Průvodcem řízení.

  1. Chcete-li přidat ovládací prvek deklarace implementace IOleObject, přidejte následující kód soubor záhlaví třídy odvozené 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();
    						
    to přidá ovládací prvek třídy vnořené třídy XMyOleObject. Poznámka: Tato makra deklarovat včetně metody rozhraní IUnknown, tak i metod IUnknown musí implementovat metody rozhraní.
  2. Přidání rozhraní IOleObject mapy rozhraní pro ovládací prvek přidáním makro INTERFACE_PART implementace souboru pro ovládací prvek:
          BEGIN_INTERFACE_MAP(CIOleOverCtrl, COleControl)
             INTERFACE_PART(CIOleOverCtrl, IID_IOleObject, MyOleObject)
          END_INTERFACE_MAP()
    						
    nahradit CIOleOverCtrl s názvem ovládací prvek a MyOleObject s názvem zvolili pro vnořené třídy, která podporuje IOleObject.
  3. Implementovat metody rozhraní je deklarována. Implementace souboru pro ovládací prvek přidejte následující kód:
          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 );
          }
          ...
Zbývající metody podle stejného vzorku kde CIOleOverCtrl je název ovládacího prvku, je název třídy vnořené podporuje IOleObject XMyOleObject a m_xMyOleObject vypočtena na odebráním z rozhraní právě podporované a přidávání m_x.

Poznámka: Tyto metody jednoduše předat volání k původní IOleObject implementace. Však není požadavku; by přidat funkce a delegovat na původní implementaci nebo delegát není vůbec.

Odkazy

Technické poznámky # 38 a # 39.

Vlastnosti

ID článku: 141277 - Poslední aktualizace: 28. února 2014 - Revize: 3.1
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Foundation Class Library 4.2 na těchto platformách
    • 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
Klíčová slova: 
kbnosurvey kbarchive kbmt kbarchitecture kbctrl kbhowto KB141277 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:141277

Dejte nám zpětnou vazbu

 

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