OBJECT1.H

/* 
* OBJECT1.H
*
* Definition of the CObject1 class that uses interface
* implementations to provide ISampleOne and ISampleTwo.
*
* Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Microsoft
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/


#ifndef _OBJECT1_H_
#define _OBJECT1_H_


//Creation function
BOOL CreateObject1(IUnknown **);


/*
* The object we want to provide in OLE supports the IUnknown,
* ISampleOne, and ISampleTwo interfaces.
*
* The C++ class, CObject1, implements these interfaces with
* "interface implementations" where the C++ class itself inherits
* from and implements IUnknown members and then contains
* other C++ classes that each separately inherit from the other
* interfaces. The other classes are the "interface implementations."
*/


/*
* In this technique you'll generally need forward references
* like this for use in declaring the object class.
*/
class CImpISampleOne;
typedef CImpISampleOne *PCImpISampleOne;

class CImpISampleTwo;
typedef CImpISampleTwo *PCImpISampleTwo;

//The C++ class that manages the actual object.
class CObject1 : public IUnknown
{
/*
* Usually interface implementations will need back pointers
* to the object itself since this object usually manages
* the important data members. In that case, make the
* interface implementation classes friends of the object.
*/

friend CImpISampleOne;
friend CImpISampleTwo;


private:
DWORD m_cRef; //Object reference count

/*
* I use "m_pImpI" as a prefix to differentiate interface
* implementations for this object from other interface
* pointer variables I might hold to other objects, whic
* would be prefixed with "m_pI".
*/
PCImpISampleOne m_pImpISampleOne;
PCImpISampleTwo m_pImpISampleTwo;

public:
CObject1(void);
~CObject1(void);

BOOL Init(void);

//IUnknown members
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(DWORD) AddRef(void);
STDMETHODIMP_(DWORD) Release(void);
};


typedef CObject1 *PCObject1;


/*
* Interface implementation classes are C++ classes that
* each singly inherit from an interface. Their IUnknown
* members delegate calls to CObject1's IUnknown members--
* since IUnknown members affect the entire *object*, and
* since these interfaces are not the object itself, we must
* delegate to implement the correct behavior.
*/

class CImpISampleOne : public ISampleOne
{
private:
DWORD m_cRef; //For debugging
PCObject1 m_pObj; //Back pointer for delegation

public:
CImpISampleOne(PCObject1);
~CImpISampleOne(void);

//IUnknown members
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(DWORD) AddRef(void);
STDMETHODIMP_(DWORD) Release(void);

//ISampleOne members
STDMETHODIMP GetMessage(LPTSTR, UINT);
};



class CImpISampleTwo : public ISampleTwo
{
private:
DWORD m_cRef; //For debugging
PCObject1 m_pObj; //Back pointer for delegation

public:
CImpISampleTwo(PCObject1);
~CImpISampleTwo(void);

//IUnknown members
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(DWORD) AddRef(void);
STDMETHODIMP_(DWORD) Release(void);

//ISampleTwo members
STDMETHODIMP GetString(LPTSTR, UINT);
};


#endif _OBJECT1_H_