summaryrefslogtreecommitdiffstats
path: root/public/sdk/inc/mfc42/afxcom_.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--public/sdk/inc/mfc42/afxcom_.h463
1 files changed, 463 insertions, 0 deletions
diff --git a/public/sdk/inc/mfc42/afxcom_.h b/public/sdk/inc/mfc42/afxcom_.h
new file mode 100644
index 000000000..26de5fd26
--- /dev/null
+++ b/public/sdk/inc/mfc42/afxcom_.h
@@ -0,0 +1,463 @@
+// This is a part of the Microsoft Foundation Classes C++ library.
+// Copyright (C) 1992-1995 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() : _pInterface(NULL) { }
+
+ // 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)
+ {
+ HRESULT hr = CreateObject(clsid, dwClsContext);
+ ASSERT(SUCCEEDED(hr));
+ }
+
+ // Calls CoCreateClass with the provided CLSID retrieved from
+ // the string.
+ _CIP(LPOLESTR str, DWORD dwClsContext = CLSCTX_INPROC_SERVER)
+ : _pInterface(NULL)
+ {
+ HRESULT hr = CreateObject(str, dwClsContext);
+ ASSERT(SUCCEEDED(hr));
+ }
+
+ // 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)
+ {
+ HRESULT hr = CreateObject(clsid);
+ ASSERT(SUCCEEDED(hr));
+ return *this;
+ }
+
+ // Calls CoCreateClass with the provided CLSID retrieved from
+ // the string.
+ _CIP& operator=(LPOLESTR str)
+ {
+ HRESULT hr = CreateObject(str);
+ ASSERT(SUCCEEDED(hr));
+ return *this;
+ }
+
+ // 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.
+ ~_CIP()
+ { _Release(); }
+
+ // 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>
+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() { }
+
+ // 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
+
+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__
+
+/////////////////////////////////////////////////////////////////////////////