home *** CD-ROM | disk | FTP | other *** search
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
-
- /////////////////////////////////////////////////////////////////////////////
- // AFXCOM_.H
- //
- // THIS FILE IS FOR MFC IMPLEMENTATION ONLY.
-
- #ifndef __AFXCOM_H__
- #define __AFXCOM_H__
-
- #ifndef _OBJBASE_H_
- #include <objbase.h>
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
-
- #ifdef _AFX_MINREBUILD
- #pragma component(minrebuild, off)
- #endif
- #ifndef _AFX_FULLTYPEINFO
- #pragma component(mintypeinfo, on)
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
-
- #ifndef _AFX_NOFORCE_LIBS
- #pragma comment(lib, "uuid.lib")
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
-
- #ifdef _AFX_PACKING
- #pragma pack(push, _AFX_PACKING)
- #endif
-
- #ifndef ASSERT
- #ifndef _INC_CRTDBG
- #include <crtdbg.h>
- #endif // _INC_CRTDBG
- #define ASSERT(x) _ASSERT(x)
- #endif // ASSERT
-
- /////////////////////////////////////////////////////////////////////////////
-
- template<class _Interface, const IID* _IID>
- class _CIP
- {
- public:
- // Declare interface type so that the type may be available outside
- // the scope of this template.
- typedef _Interface Interface;
-
- // When the compiler supports references in template params,
- // _CLSID will be changed to a reference. To avoid conversion
- // difficulties this function should be used to obtain the
- // CLSID.
- static const IID& GetIID()
- { ASSERT(_IID != NULL); return *_IID; }
-
- // Construct empty in preperation for assignment.
- _CIP();
-
- // Copy the pointer and AddRef().
- _CIP(const _CIP& cp) : _pInterface(cp._pInterface)
- { _AddRef(); }
-
- // Saves and AddRef()'s the interface
- _CIP(Interface* pInterface) : _pInterface(pInterface)
- { _AddRef(); }
-
- // Copies the pointer. If bAddRef is TRUE, the interface will
- // be AddRef()ed.
- _CIP(Interface* pInterface, BOOL bAddRef)
- : _pInterface(pInterface)
- {
- if (bAddRef)
- {
- ASSERT(pInterface != NULL);
- _AddRef();
- }
- }
-
- // Calls CoCreateClass with the provided CLSID.
- _CIP(const CLSID& clsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER)
- : _pInterface(NULL)
- {
- CreateObject(clsid, dwClsContext);
- }
-
- // Calls CoCreateClass with the provided CLSID retrieved from
- // the string.
- _CIP(LPOLESTR str, DWORD dwClsContext = CLSCTX_INPROC_SERVER)
- : _pInterface(NULL)
- {
- CreateObject(str, dwClsContext);
- }
-
- // Saves and AddRef()s the interface.
- _CIP& operator=(Interface* pInterface)
- {
- if (_pInterface != pInterface)
- {
- Interface* pOldInterface = _pInterface;
- _pInterface = pInterface;
- _AddRef();
- if (pOldInterface != NULL)
- pOldInterface->Release();
- }
- return *this;
- }
-
- // Copies and AddRef()'s the interface.
- _CIP& operator=(const _CIP& cp)
- { return operator=(cp._pInterface); }
-
- // Releases any current interface and loads the class with the
- // provided CLSID.
- _CIP& operator=(const CLSID& clsid)
- {
- CreateObject(clsid);
- return *this;
- }
-
- // Calls CoCreateClass with the provided CLSID retrieved from
- // the string.
- _CIP& operator=(LPOLESTR str)
- {
- CreateObject(str);
- return *this;
- }
-
- ~_CIP();
-
- // Saves/sets the interface without AddRef()ing. This call
- // will release any previously aquired interface.
- void Attach(Interface* pInterface)
- {
- _Release();
- _pInterface = pInterface;
- }
-
- // Saves/sets the interface only AddRef()ing if bAddRef is TRUE.
- // This call will release any previously aquired interface.
- void Attach(Interface* pInterface, BOOL bAddRef)
- {
- _Release();
- _pInterface = pInterface;
- if (bAddRef)
- {
- ASSERT(pInterface != NULL);
- pInterface->AddRef();
- }
- }
-
- // Simply NULL the interface pointer so that it isn't Released()'ed.
- void Detach()
- {
- ASSERT(_pInterface);
- _pInterface = NULL;
- }
-
- // Return the interface. This value may be NULL
- operator Interface*() const
- { return _pInterface; }
-
- // Queries for the unknown and return it
- operator IUnknown*()
- { return _pInterface; }
-
- // Provides minimal level assertion before use.
- operator Interface&() const
- { ASSERT(_pInterface); return *_pInterface; }
-
- // Allows an instance of this class to act as though it were the
- // actual interface. Also provides minimal assertion verification.
- Interface& operator*() const
- { ASSERT(_pInterface); return *_pInterface; }
-
- // Returns the address of the interface pointer contained in this
- // class. This is useful when using the COM/OLE interfaces to create
- // this interface.
- Interface** operator&()
- {
- _Release();
- _pInterface = NULL;
- return &_pInterface;
- }
-
- // Allows this class to be used as the interface itself.
- // Also provides simple assertion verification.
- Interface* operator->() const
- { ASSERT(_pInterface != NULL); return _pInterface; }
-
- // This operator is provided so that simple boolean expressions will
- // work. For example: "if (p) ...".
- // Returns TRUE if the pointer is not NULL.
- operator BOOL() const
- { return _pInterface != NULL; }
-
- // Returns TRUE if the interface is NULL.
- // This operator will be removed when support for type bool
- // is added to the compiler.
- BOOL operator!()
- { return _pInterface == NULL; }
-
- // Provides assertion verified, Release()ing of this interface.
- void Release()
- {
- ASSERT(_pInterface != NULL);
- _pInterface->Release();
- _pInterface = NULL;
- }
-
- // Provides assertion verified AddRef()ing of this interface.
- void AddRef()
- { ASSERT(_pInterface != NULL); _pInterface->AddRef(); }
-
- // Another way to get the interface pointer without casting.
- Interface* GetInterfacePtr() const
- { return _pInterface; }
-
- // Loads an interface for the provided CLSID.
- // Returns an HRESULT. Any previous interface is released.
- HRESULT CreateObject(
- const CLSID& clsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER)
- {
- _Release();
- HRESULT hr = CoCreateInstance(clsid, NULL, dwClsContext,
- GetIID(), reinterpret_cast<void**>(&_pInterface));
- ASSERT(SUCCEEDED(hr));
- return hr;
- }
-
- // Creates the class specified by clsidString. clsidString may
- // contain a class id, or a prog id string.
- HRESULT CreateObject(
- LPOLESTR clsidString, DWORD dwClsContext=CLSCTX_INPROC_SERVER)
- {
- ASSERT(clsidString != NULL);
- CLSID clsid;
- HRESULT hr;
- if (clsidString[0] == '{')
- hr = CLSIDFromString(clsidString, &clsid);
- else
- hr = CLSIDFromProgID(clsidString, &clsid);
- ASSERT(SUCCEEDED(hr));
- if (FAILED(hr))
- return hr;
- return CreateObject(clsid, dwClsContext);
- }
-
- // Performs a QI on pUnknown for the interface type returned
- // for this class. The interface is stored. If pUnknown is
- // NULL, or the QI fails, E_NOINTERFACE is returned and
- // _pInterface is set to NULL.
- HRESULT QueryInterface(IUnknown* pUnknown)
- {
- if (pUnknown == NULL) // Can't QI NULL
- {
- operator=(static_cast<Interface*>(NULL));
- return E_NOINTERFACE;
- }
-
- // Query for this interface
- Interface* pInterface;
- HRESULT hr = pUnknown->QueryInterface(GetIID(),
- reinterpret_cast<void**>(&pInterface));
- if (FAILED(hr))
- {
- // If failed intialize interface to NULL and return HRESULT.
- Attach(NULL);
- return hr;
- }
-
- // Save the interface without AddRef()ing.
- Attach(pInterface);
- return hr;
- }
-
- private:
- // Releases only if the interface is not null.
- // The interface is not set to NULL.
- void _Release()
- {
- if (_pInterface != NULL)
- _pInterface->Release();
- }
-
- // AddRefs only if the interface is not NULL
- void _AddRef()
- {
- if (_pInterface != NULL)
- _pInterface->AddRef();
- }
-
- // The Interface.
- Interface* _pInterface;
- }; // class _CIP
-
- template<class _Interface, const IID* _IID>
- _CIP<_Interface, _IID>::_CIP<_Interface, _IID>()
- : _pInterface(NULL)
- {
- }
-
- template<class _Interface, const IID* _IID>
- _CIP<_Interface, _IID>::~_CIP<_Interface, _IID>()
- {
- // If we still have an interface then Release() it. The interface
- // may be NULL if Detach() has previosly been called, or if it was
- // never set.
-
- _Release();
- }
-
- template<class _Interface, const IID* _IID>
- class CIP : public _CIP<_Interface, _IID>
- {
- public:
- // Simplified name for base class and provide derived classes
- // access to base type
- typedef _CIP<_Interface, _IID> BC;
-
- // Provideds derived classes access to the interface type.
- typedef _Interface Interface;
-
- // Construct empty in preperation for assignment.
- CIP() { }
- ~CIP();
-
- // Copy the pointer and AddRef().
- CIP(const CIP& cp) : _CIP<_Interface, _IID>(cp) { }
-
- // Saves and AddRef()s the interface.
- CIP(Interface* pInterface) : _CIP<_Interface, _IID>(pInterface) { }
-
- // Saves the interface and AddRef()s only if bAddRef is TRUE.
- CIP(Interface* pInterface, BOOL bAddRef)
- : _CIP<_Interface, _IID>(pInterface, bAddRef) { }
-
- // Queries for this interface.
- CIP(IUnknown* pUnknown)
- {
- if (pUnknown == NULL)
- return;
- Interface* pInterface;
- HRESULT hr = pUnknown->QueryInterface(GetIID(),
- reinterpret_cast<void**>(&pInterface));
- ASSERT(SUCCEEDED(hr));
- Attach(pInterface);
- }
-
- // Creates the interface from the CLSID.
- CIP(const CLSID& clsid) : _CIP<_Interface, _IID>(clsid) { }
-
- // Creates the interface from the CLSID.
- CIP(LPOLESTR str) : _CIP<_Interface, _IID>(str) { }
-
- // Copies and AddRef()'s the interface.
- CIP& operator=(const CIP& cp)
- { _CIP<_Interface, _IID>::operator=(cp); return *this; }
-
- // Saves and AddRef()s the interface.
- CIP& operator=(Interface* pInterface)
- { _CIP<_Interface, _IID>::operator=(pInterface); return *this; }
-
- CIP& operator=(IUnknown* pUnknown)
- {
- HRESULT hr = QueryInterface(pUnknown);
- ASSERT(SUCCEEDED(hr));
- return *this;
- }
-
- // Releases any current interface and loads the class with the
- // provided CLSID.
- CIP& operator=(const CLSID& clsid)
- { _CIP<_Interface, _IID>::operator=(clsid); return *this; }
-
- // Releases any current interface and loads the class with the
- // provided CLSID.
- CIP& operator=(LPOLESTR str)
- { _CIP<_Interface, _IID>::operator=(str); return *this; }
- }; // class CIP
-
- template<class _Interface, const IID* _IID>
- CIP<_Interface, _IID>::~CIP()
- {
- }
-
- #if _MSC_VER > 1020
- template<>
- #endif
- class CIP<IUnknown, &IID_IUnknown> : public _CIP<IUnknown, &IID_IUnknown>
- {
- public:
- // Simplified name for base class and provide derived classes
- // access to base type
- typedef _CIP<IUnknown, &IID_IUnknown> BC;
-
- // Provideds derived classes access to the interface type.
- typedef IUnknown Interface;
-
- // Construct empty in preperation for assignment.
- CIP() { }
-
- // Copy the pointer and AddRef().
- CIP(const CIP& cp) : _CIP<IUnknown, &IID_IUnknown>(cp) { }
-
- // Saves and AddRef()s the interface.
- CIP(Interface* pInterface)
- : _CIP<IUnknown, &IID_IUnknown>(pInterface) { }
-
- // Saves and then AddRef()s only if bAddRef is TRUE.
- CIP(Interface* pInterface, BOOL bAddRef)
- : _CIP<IUnknown, &IID_IUnknown>(pInterface, bAddRef) { }
-
- // Creates the interface from the CLSID.
- CIP(const CLSID& clsid) : _CIP<IUnknown, &IID_IUnknown>(clsid) { }
-
- // Creates the interface from the CLSID.
- CIP(LPOLESTR str) : _CIP<IUnknown, &IID_IUnknown>(str) { }
-
- // Copies and AddRef()'s the interface.
- CIP& operator=(const CIP& cp)
- { _CIP<IUnknown, &IID_IUnknown>::operator=(cp); return *this; }
-
- // Saves and AddRef()s the interface. The previously saved
- // interface is released.
- CIP& operator=(Interface* pInterface)
- { _CIP<IUnknown, &IID_IUnknown>::operator=(pInterface); return *this; }
-
- // Releases any current interface and loads the class with the
- // provided CLSID.
- CIP& operator=(const CLSID& clsid)
- { _CIP<IUnknown, &IID_IUnknown>::operator=(clsid); return *this; }
-
- // Releases any current interface and loads the class with the
- // provided CLSID.
- CIP& operator=(LPOLESTR str)
- { _CIP<IUnknown, &IID_IUnknown>::operator=(str); return *this; }
-
- // Queries for the unknown and return it
- operator IUnknown*()
- { return GetInterfacePtr(); }
-
- // Verifies that pUnknown is not null and performs assignment.
- HRESULT QueryInterface(IUnknown* pUnknown)
- {
- _CIP<IUnknown, &IID_IUnknown>::operator=(pUnknown);
- return pUnknown != NULL ? S_OK : E_NOINTERFACE;
- }
- }; // CIP<IUnknown, &IID_IUnknown>
-
- #define IPTR(x) CIP<x, &IID_##x>
- #define DEFINE_IPTR(x) typedef IPTR(x) x##Ptr;
-
- /////////////////////////////////////////////////////////////////////////////
-
- #ifdef _AFX_PACKING
- #pragma pack(pop)
- #endif
-
- #ifdef _AFX_MINREBUILD
- #pragma component(minrebuild, on)
- #endif
- #ifndef _AFX_FULLTYPEINFO
- #pragma component(mintypeinfo, off)
- #endif
-
- #endif // __AFXCOM_H__
-
- /////////////////////////////////////////////////////////////////////////////
-