home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / tutsamp / licclien / utcrucar.h < prev   
C/C++ Source or Header  |  1997-08-05  |  7KB  |  166 lines

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