UTCRUCAR.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*+==========================================================================
  2.   File:      UTCRUCAR.H
  3.   Summary:   Include file for the aggregatable COUtilityCruiseCar COM
  4.              object class.
  5.              UTCRUCAR showcases the construction of the COUtilityCruiseCar
  6.              COM object class with the IUnknown, ICar, ICruise, and IUtility
  7.              interfaces.  This is done through Aggregation reuse of a
  8.              COCruiseCar COM object (specifically providing its ICar and
  9.              ICruise interface features).  COUtilityCruiseCar adds its own
  10.              native implementation of the IUtility interface.  The
  11.              aggregated CruiseCar object is implemented and provided in
  12.              an outside COMOBJ.DLL.
  13.              This multiple interface COM Object Class is achieved via
  14.              the technique of nested classes: the implementation of the
  15.              IUtility interface is nested inside of the COUtilityCruiseCar
  16.              COM object class.
  17.              For a comprehensive tutorial code tour of this module's
  18.              contents and offerings see the tutorial COMUSER.HTM
  19.              file.  For more specific technical details on the internal
  20.              workings see the comments dispersed throughout the
  21.              module's source code.
  22.   Classes:   COUtilityCruiseCar
  23.   Functions: .
  24.   Origin:    8-29-95: atrent - Editor inheritance from CRUCAR.H.
  25. ----------------------------------------------------------------------------
  26.   This file is part of the Microsoft COM Tutorial Code Samples.
  27.   Copyright (C) Microsoft Corporation, 1997.  All rights reserved.
  28.   This source code is intended only as a supplement to Microsoft
  29.   Development Tools and/or on-line documentation.  See these other
  30.   materials for detailed information regarding Microsoft code samples.
  31.   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  32.   KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  33.   IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  34.   PARTICULAR PURPOSE.
  35. ==========================================================================+*/
  36. #if !defined(UTCRUCAR_H)
  37. #define UTCRUCAR_H
  38. #ifdef __cplusplus
  39. /*O+O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O+++O
  40.   ObjectClass: COUtilityCruiseCar
  41.   Summary:     COM Object Class for COUtilityCruiseCar COM Objects.
  42.                COM objects of this class augment COCruiseCar COM objects
  43.                with the IUtility interface features of Offroad and Winch.
  44.                COCruiseCar is reused to offer this COUtilityCruiseCar COM
  45.                Object the ICar interface features of Shift, Clutch, Speed,
  46.                Steer and the ICruise interface features of Engage and
  47.                Adjust.  This COUtilityCruiseCar COM object class is
  48.                constructed by aggregation reuse of the COCruiseCar COM
  49.                object class.  The mulitple interfaces on this COM object
  50.                class are constructed via the nested class
  51.                interfaces technique.
  52.   Interfaces:  IUnknown
  53.                  Standard interface providing COM object features.
  54.                ICar
  55.                  Basic car features.
  56.                ICruise
  57.                  Cruise control system features.
  58.                IUtility
  59.                  Sport-utility Car operation features.  Implemented in
  60.                  this COM object.
  61.   Aggregation: Yes, COUtilityCruiseCar COM objects are aggregatable by
  62.                passing a non-NULL pUnkOuter IUnknown pointer into
  63.                the constructor.
  64. O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O---O-O*/
  65. class COUtilityCruiseCar : public IUnknown
  66. {
  67.   public:
  68.     // Main Object Constructor & Destructor.
  69.     COUtilityCruiseCar(IUnknown* pUnkOuter);
  70.     ~COUtilityCruiseCar(void);
  71.     // A general method for initializing a newly created UtilityCruiseCar.
  72.     HRESULT Init(void);
  73.     // IUnknown members. Main object, non-delegating.
  74.     STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  75.     STDMETHODIMP_(ULONG) AddRef(void);
  76.     STDMETHODIMP_(ULONG) Release(void);
  77.   private:
  78.     // We declare nested class interface implementations here.
  79.     // We implement the IUtility interface (of course) in this
  80.     // COUtilityCruiseCar COM object class.  This is the native interface
  81.     // that we are using as an augmentation to the existing COCruiseCar
  82.     // COM object class.
  83.     class CImpIUtility : public IUtility
  84.     {
  85.       public:
  86.         // Interface Implementation Constructor & Destructor.
  87.         CImpIUtility(COUtilityCruiseCar* pBackObj, IUnknown* pUnkOuter);
  88.         ~CImpIUtility(void);
  89.         // IUnknown members.
  90.         STDMETHODIMP         QueryInterface(REFIID, PPVOID);
  91.         STDMETHODIMP_(ULONG) AddRef(void);
  92.         STDMETHODIMP_(ULONG) Release(void);
  93.         // IUtility members.
  94.         STDMETHODIMP Offroad(short nGear);
  95.         STDMETHODIMP Winch(short nRpm);
  96.       private:
  97.         // Data private to this interface implementation of IUtility.
  98.         ULONG               m_cRefI;     // Interface Ref Count (debugging).
  99.         COUtilityCruiseCar* m_pBackObj;  // Parent Object back pointer.
  100.         IUnknown*           m_pUnkOuter; // Outer unknown for Delegation.
  101.     };
  102.     // Make the otherwise private and nested IUtility interface
  103.     // implementation a friend to COM object instantiations of this
  104.     // selfsame COUtilityCruiseCar COM object class.
  105.     friend CImpIUtility;
  106.     // Private data of COUtilityCruiseCar COM objects.
  107.     // Nested IUtility implementation instantiation.  This IUtility
  108.     // interface is instantiated inside this COUtilityCruiseCar object
  109.     // as a native interface.
  110.     CImpIUtility    m_ImpIUtility;
  111.     // Main Object reference count.
  112.     ULONG           m_cRefs;
  113.     // Outer unknown (aggregation delegation). Used when this
  114.     // COUtilityCruiseCar object is being aggregated.
  115.     IUnknown*       m_pUnkOuter;
  116.     // We need to save the IUnknown interface pointer on the COCruiseCar
  117.     // object that we aggregate.  We use this when we need to delegate
  118.     // IUnknown calls to this aggregated inner object.
  119.     IUnknown*       m_pUnkCruiseCar;
  120. };
  121. typedef COUtilityCruiseCar* PCOUtilityCruiseCar;
  122. // Here is a prototpye for the UtilityCruiseCar Creation function.
  123. HRESULT CreateUtilityCruiseCar(
  124.           IUnknown* pUnkOuter,
  125.           REFIID riid,
  126.           PPVOID ppv);
  127. #endif // __cplusplus
  128. #endif // UTCRUCAR_H