Click here to Skip to main content
15,892,537 members
Articles / High Performance Computing / Vectorization

A C++ String Class

Rate me:
Please Sign up or sign in to vote.
4.96/5 (29 votes)
3 Jan 2015CPOL13 min read 121.2K   2.6K   93  
A fast, reference counted, copy-on-write string class
// hwinobjimpl.h
#pragma once

#ifndef __HWINOBJIMPL_H__
#define __HWINOBJIMPL_H__

#include "hwinobj.h"

namespace harlinn
{
    namespace windows
    {

        class ComObjectBase : public IUnknown
        {
            long referenceCount;
            IUnknown* pUnknown;
            std::map<Guid,IUnknown*> interfaceMap;
        public:
            ComObjectBase()
                  : referenceCount(1),
                    pUnknown(0)
            {}

            ComObjectBase(IUnknown* theOuterUnknown)
                  : referenceCount(1),
                    pUnknown(theOuterUnknown)
            {}

            ComObjectBase(const ComObjectBase& other)
                  : referenceCount(1),
                    pUnknown(other.pUnknown)
            {}


            virtual ~ComObjectBase()
            {}


            ComObjectBase& InternalAddInterface(REFIID riid, IUnknown* pInterface )
            {
                if(pInterface)
                {
                    auto it = interfaceMap.find(riid);
                    if(it == interfaceMap.end())
                    {
                        interfaceMap.insert(std::map<Guid,IUnknown*>::value_type(riid,pInterface));
                    }
                }
                return *this;
            }

            IUnknown* InternalFindInterface(REFIID riid)
            {
                auto it = interfaceMap.find(riid);
                if(it != interfaceMap.end())
                {
                    return (*it).second;
                }
                return nullptr;
            }

            

            virtual HRESULT InternalQueryInterface( REFIID riid,void ** ppvObject )
            {
                if(!ppvObject)
                {
                    return E_INVALIDARG;
                }
                IUnknown* pInterface = InternalFindInterface(riid);
                if(pInterface)
                {
                    *ppvObject = pInterface;
                    pInterface->AddRef();
                    return NO_ERROR;
                }
                if(pUnknown)
                {
                    return pUnknown->QueryInterface(riid, ppvObject);
                }
                return E_NOINTERFACE;
            }

            ULONG InternalAddRef( )
            {
                long res = InterlockedIncrement(&referenceCount);
                return res;
            }

            HWIN_EXPORT ULONG InternalRelease( );
            
            virtual HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid,void ** ppvObject)
            {
                auto hr = this->InternalQueryInterface( riid,ppvObject);
                return hr;
            }

            virtual ULONG STDMETHODCALLTYPE AddRef( )
            {
                auto res = InternalAddRef( );
                return res;
            }

            virtual ULONG STDMETHODCALLTYPE Release( )
            {
                auto res = InternalRelease( );
                return res;
            }


        };

        template< typename Type_, typename Interface_ >
        class IUnknownImpl : public Interface_
        {
        public:
            typedef Type_ Type;
            typedef IUnknown InterfaceType;
            
        protected:
            Type* comObject;
        public:
            IUnknownImpl(Type* theComObject)
                : comObject(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IUnknown,this);
            }

            
            virtual HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid,void ** ppvObject)
            {
                auto hr = static_cast<Type*>(comObject)->InternalQueryInterface( riid,ppvObject);
                return hr;
            }

            virtual ULONG STDMETHODCALLTYPE AddRef( )
            {
                auto res = static_cast<Type*>(comObject)->InternalAddRef( );
                return res;
            }

            virtual ULONG STDMETHODCALLTYPE Release( )
            {
                auto res = static_cast<Type*>(comObject)->InternalRelease( );
                return res;
            }
            
        };


        template< typename Type_, typename Interface_ = IClassFactory >
        class IClassFactoryImpl : public IUnknownImpl< Type_ , Interface_>
        {
        public:
            typedef Type_ Type;
            typedef IClassFactory InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IClassFactoryImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE CreateInstance( IUnknown *pUnkOuter,REFIID riid, void **ppvObject)
            {
                auto res = static_cast<Type*>(comObject)->CreateInstance( pUnkOuter,riid, ppvObject);
                return res;
            }
            virtual HRESULT STDMETHODCALLTYPE LockServer( BOOL fLock)
            {
                auto res = static_cast<Type*>(comObject)->LockServer(fLock);
                return res;
            }
        };

        
        template< typename Type_, typename Interface_ = IClassFactory2 >
        class IClassFactory2Impl : public IClassFactoryImpl< Type_ , Interface_>
        {
        public:
            typedef Type_ Type;
            typedef IClassFactory2 InterfaceType;

            typedef IClassFactoryImpl< Type_, Interface_ > Base;
            IClassFactory2Impl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }
            virtual HRESULT STDMETHODCALLTYPE GetLicInfo( LICINFO *pLicInfo)
            {
                auto res = static_cast<Type*>(comObject)->GetLicInfo( pLicInfo);
                return res;
            }
            virtual HRESULT STDMETHODCALLTYPE RequestLicKey( DWORD dwReserved, BSTR *pBstrKey)
            {
                auto res = static_cast<Type*>(comObject)->RequestLicKey( dwReserved, pBstrKey);
                return res;
            }
            virtual HRESULT STDMETHODCALLTYPE CreateInstanceLic( IUnknown *pUnkOuter,IUnknown *pUnkReserved,REFIID riid,BSTR bstrKey,PVOID *ppvObj)
            {
                auto res = static_cast<Type*>(comObject)->CreateInstanceLic( pUnkOuter,pUnkReserved,riid,bstrKey,ppvObj);
                return res;
            }
        };


        template< typename Type_, typename Interface_ = IEnumUnknown >
        class IEnumUnknownImpl : public IUnknownImpl< Type_ , Interface_>
        {
        public:
            typedef Type_ Type;
            typedef IEnumUnknown InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IEnumUnknownImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE Next( ULONG celt, IUnknown **rgelt, ULONG *pceltFetched )
            {
                auto res = static_cast<Type*>(comObject)->Next( celt, rgelt, pceltFetched );
                return res;
            }
        
            virtual HRESULT STDMETHODCALLTYPE Skip( ULONG celt )
            {
                auto res = static_cast<Type*>(comObject)->Skip( celt );
                return res;
            }
        
            virtual HRESULT STDMETHODCALLTYPE Reset( )
            {
                auto res = static_cast<Type*>(comObject)->Reset( );
                return res;
            }
        
            virtual HRESULT STDMETHODCALLTYPE Clone(IEnumUnknown **ppenum)
            {
                auto res = static_cast<Type*>(comObject)->Clone(ppenum);
                return res;
            }
        };


        template< typename Type_, typename Interface_ = IEnumVARIANT >
        class IEnumVARIANTImpl : public IUnknownImpl< Type_ , Interface_>
        {
        public:
            typedef Type_ Type;
            typedef IEnumVARIANT InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IEnumVARIANTImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE Next( ULONG celt,VARIANT *rgVar,ULONG *pCeltFetched)
            {
                auto res = static_cast<Type*>(comObject)->Next( celt, rgVar, pCeltFetched );
                return res;
            }
        
            virtual HRESULT STDMETHODCALLTYPE Skip( ULONG celt)
            {
                auto res = static_cast<Type*>(comObject)->Skip( celt );
                return res;
            }
        
            virtual HRESULT STDMETHODCALLTYPE Reset( )
            {
                auto res = static_cast<Type*>(comObject)->Reset( );
                return res;
            }
        
            virtual HRESULT STDMETHODCALLTYPE Clone( IEnumVARIANT **ppEnum)
            {
                auto res = static_cast<Type*>(comObject)->Clone(ppEnum);
                return res;
            }
        };


        template< typename Type_, typename Interface_ = IEnumString >
        class IEnumStringImpl : public IUnknownImpl< Type_ , Interface_>
        {
        public:
            typedef Type_ Type;
            typedef IEnumString InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IEnumStringImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt,LPOLESTR *rgelt,ULONG *pceltFetched)
            {
                auto res = static_cast<Type*>(comObject)->Next(celt,rgelt,pceltFetched);
                return res;
            }
            virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt)
            {
                auto res = static_cast<Type*>(comObject)->Skip(celt);
                return res;
            }

            virtual HRESULT STDMETHODCALLTYPE Reset( )
            {
                auto res = static_cast<Type*>(comObject)->Reset( );
                return res;
            }

            virtual HRESULT STDMETHODCALLTYPE Clone(IEnumString **ppenum)
            {
                auto res = static_cast<Type*>(comObject)->Clone(ppenum);
                return res;
            }
        };



        template< typename Type_, typename Interface_ = IDispatch >
        class IDispatchImpl : public IUnknownImpl< Type_ , Interface_>
        {
        public:
            typedef Type_ Type;
            typedef IDispatch InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IDispatchImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo)
            {
                auto res = static_cast<Type*>(comObject)->GetTypeInfoCount(pctinfo);
                return res;
            }
            virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo)
            {
                auto res = static_cast<Type*>(comObject)->GetTypeInfo( iTInfo,lcid,ppTInfo);
                return res;
            }
            virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId)
            {
                auto res = static_cast<Type*>(comObject)->GetIDsOfNames( riid,rgszNames,cNames,lcid,rgDispId);
                return res;
            }
            virtual HRESULT STDMETHODCALLTYPE Invoke( DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr)
            {
                auto res = static_cast<Type*>(comObject)->Invoke( dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
                return res;
            }

        };


        
        template< typename Type_, typename Interface_ = IProvideClassInfo >
        class IProvideClassInfoImpl : public IUnknownImpl< Type_ , Interface_>
        {
        public:
            typedef Type_ Type;
            typedef IProvideClassInfo InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IProvideClassInfoImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetClassInfo( ITypeInfo **ppTI)
            {
                return static_cast<Type*>(comObject)->GetClassInfo(ppTI);
            }
        };


        template< typename Type_, typename Interface_ = IProvideClassInfo >
        class IProvideClassInfo2Impl : public IProvideClassInfoImpl < Type_ , Interface_>
        {
        public:
            typedef Type_ Type;
            typedef IProvideClassInfo2 InterfaceType;

            typedef IProvideClassInfoImpl < Type_, Interface_ > Base;
            IProvideClassInfo2Impl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }
            virtual HRESULT STDMETHODCALLTYPE GetGUID( DWORD dwGuidKind,GUID *pGUID)
            {
                return static_cast<Type*>(comObject)->GetGUID( dwGuidKind,pGUID);
            }

        };

        
        template< typename Type_, typename Interface_ = IProvideClassInfo >
        class IProvideMultipleClassInfoImpl : public IProvideClassInfo2Impl < Type_ , Interface_>
        {
        public:
            typedef Type_ Type;
            typedef IProvideMultipleClassInfo InterfaceType;

            typedef IProvideClassInfo2Impl < Type_, Interface_ > Base;
            IProvideMultipleClassInfoImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }
            
            virtual HRESULT STDMETHODCALLTYPE GetMultiTypeInfoCount( ULONG *pcti)
            {
                return static_cast<Type*>(comObject)->GetMultiTypeInfoCount( pcti);
            }
            virtual HRESULT STDMETHODCALLTYPE GetInfoOfIndex( ULONG iti,DWORD dwFlags,ITypeInfo **pptiCoClass,DWORD *pdwTIFlags,ULONG *pcdispidReserved,IID *piidPrimary,IID *piidSource)
            {
                return static_cast<Type*>(comObject)->GetInfoOfIndex( iti,dwFlags,pptiCoClass,,pcdispidReserved,piidPrimary,piidSource);
            }

        };

        template< typename Type_, typename Interface_ = ISequentialStream >
        class ISequentialStreamImpl : public IUnknownImpl< Type_ , Interface_>
        {
        public:
            typedef Type_ Type;
            typedef ISequentialStream InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            ISequentialStreamImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_ISequentialStream,this);
            }

            virtual HRESULT STDMETHODCALLTYPE Read(void *pv,ULONG cb,ULONG *pcbRead)
            {
                return static_cast<Type*>(comObject)->Read(pv,cb,pcbRead);
            }
            virtual HRESULT STDMETHODCALLTYPE Write( const void *pv, ULONG cb, ULONG *pcbWritten)
            {
                return static_cast<Type*>(comObject)->Write( pv, cb, pcbWritten);
            }
        };


        template< typename Type_, typename Interface_ = IStream >
        class IStreamImpl : public virtual ISequentialStreamImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IStream InterfaceType;

            typedef ISequentialStreamImpl< Type_, Interface_ > Base;
            IStreamImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IStream,this);
            }


            virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER dlibMove,DWORD dwOrigin,ULARGE_INTEGER *plibNewPosition)
            {
                return static_cast<Type*>(comObject)->Seek(dlibMove,dwOrigin,plibNewPosition);
            }
        
            virtual HRESULT STDMETHODCALLTYPE SetSize( ULARGE_INTEGER libNewSize)
            {
                return static_cast<Type*>(comObject)->SetSize( libNewSize);
            }
        
            virtual HRESULT STDMETHODCALLTYPE CopyTo( IStream *pstm,ULARGE_INTEGER cb,ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
            {
                return static_cast<Type*>(comObject)->CopyTo(pstm,cb,pcbRead, pcbWritten);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Commit(DWORD grfCommitFlags)
            {
                return static_cast<Type*>(comObject)->Commit(grfCommitFlags);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Revert( )
            {
                return static_cast<Type*>(comObject)->Revert( );
            }
        
            virtual HRESULT STDMETHODCALLTYPE LockRegion( ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType)
            {
                return static_cast<Type*>(comObject)->LockRegion( libOffset,cb,dwLockType);
            }
        
            virtual HRESULT STDMETHODCALLTYPE UnlockRegion( ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType)
            {
                return static_cast<Type*>(comObject)->UnlockRegion( libOffset,cb,dwLockType);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Stat( STATSTG *pstatstg,DWORD grfStatFlag)
            {
                return static_cast<Type*>(comObject)->Stat( pstatstg,grfStatFlag);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Clone( IStream **ppstm )
            {
                return static_cast<Type*>(comObject)->Clone( ppstm );
            }

        };

        
        template< typename Type_, typename Interface_ = IOleAdviseHolder >
        class IOleAdviseHolderImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleAdviseHolder InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IOleAdviseHolderImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IOleAdviseHolder,this);
            }

            virtual HRESULT STDMETHODCALLTYPE Advise( IAdviseSink *pAdvise,DWORD *pdwConnection)
            {
                return static_cast<Type*>(comObject)->Advise( pAdvise,pdwConnection);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Unadvise(DWORD dwConnection)
            {
                return static_cast<Type*>(comObject)->Unadvise(dwConnection);
            }
        
            virtual HRESULT STDMETHODCALLTYPE EnumAdvise( IEnumSTATDATA **ppenumAdvise)
            {
                return static_cast<Type*>(comObject)->EnumAdvise( ppenumAdvise);
            }
        
            virtual HRESULT STDMETHODCALLTYPE SendOnRename( IMoniker *pmk)
            {
                return static_cast<Type*>(comObject)->SendOnRename( pmk);
            }
        
            virtual HRESULT STDMETHODCALLTYPE SendOnSave( )
            {
                return static_cast<Type*>(comObject)->SendOnSave( );
            }
        
            virtual HRESULT STDMETHODCALLTYPE SendOnClose( )
            {
                return static_cast<Type*>(comObject)->SendOnClose( );
            }
        };

        
        template< typename Type_, typename Interface_ = IOleCache >
        class IOleCacheImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleCache InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IOleCacheImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE Cache( FORMATETC *pformatetc,DWORD advf,DWORD *pdwConnection)
            {
                return static_cast<Type*>(comObject)->Cache( pformatetc,advf,pdwConnection);
            }
            virtual HRESULT STDMETHODCALLTYPE Uncache(DWORD dwConnection)
            {
                return static_cast<Type*>(comObject)->Uncache(dwConnection);
            }
            virtual HRESULT STDMETHODCALLTYPE EnumCache( IEnumSTATDATA **ppenumSTATDATA)
            {
                return static_cast<Type*>(comObject)->EnumCache( ppenumSTATDATA);
            }
            virtual HRESULT STDMETHODCALLTYPE InitCache( IDataObject *pDataObject)
            {
                return static_cast<Type*>(comObject)->InitCache( pDataObject);
            }
            virtual HRESULT STDMETHODCALLTYPE SetData( FORMATETC *pformatetc,STGMEDIUM *pmedium,BOOL fRelease)
            {
                return static_cast<Type*>(comObject)->SetData( pformatetc,pmedium,fRelease);
            }
        };

        template< typename Type_, typename Interface_ = IOleCache2 >
        class IOleCache2Impl : public IOleCacheImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleCache2 InterfaceType;

            typedef IOleCacheImpl< Type_, Interface_ > Base;
            IOleCache2Impl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE UpdateCache( LPDATAOBJECT pDataObject,DWORD grfUpdf,LPVOID pReserved)
            {
                return static_cast<Type*>(comObject)->UpdateCache( pDataObject,grfUpdf,pReserved);
            }

            virtual HRESULT STDMETHODCALLTYPE DiscardCache( DWORD dwDiscardOptions)
            {
                return static_cast<Type*>(comObject)->DiscardCache( dwDiscardOptions);
            }

        };

        
        template< typename Type_, typename Interface_ = IOleCacheControl >
        class IOleCacheControlImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleCacheControl InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IOleCacheControlImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE OnRun( LPDATAOBJECT pDataObject)
            {
                return static_cast<Type*>(comObject)->OnRun( pDataObject);
            }
            virtual HRESULT STDMETHODCALLTYPE OnStop( )
            {
                return static_cast<Type*>(comObject)->OnStop( );
            }
        };

        
        template< typename Type_, typename Interface_ = IParseDisplayName >
        class IParseDisplayNameImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IParseDisplayName InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IParseDisplayNameImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE ParseDisplayName( IBindCtx *pbc,LPOLESTR pszDisplayName,ULONG *pchEaten,IMoniker **ppmkOut)
            {
                return static_cast<Type*>(comObject)->ParseDisplayName( pbc,pszDisplayName,pchEaten,ppmkOut);
            }
        };

        
        template< typename Type_, typename Interface_ = IOleContainer >
        class IOleContainerImpl : public IParseDisplayNameImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleContainer InterfaceType;

            typedef IParseDisplayNameImpl< Type_, Interface_ > Base;
            IOleContainerImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE EnumObjects( DWORD grfFlags,IEnumUnknown **ppenum)
            {
                return static_cast<Type*>(comObject)->EnumObjects( grfFlags,ppenum);
            }

            virtual HRESULT STDMETHODCALLTYPE LockContainer( BOOL fLock)
            {
                return static_cast<Type*>(comObject)->LockContainer( fLock);
            }
        };

        
        template< typename Type_, typename Interface_ = IOleClientSite >
        class IOleClientSiteImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleClientSite InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IOleClientSiteImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE SaveObject( )
            {
                return static_cast<Type*>(comObject)->SaveObject( );
            }
            virtual HRESULT STDMETHODCALLTYPE GetMoniker( DWORD dwAssign,DWORD dwWhichMoniker,IMoniker **ppmk)
            {
                return static_cast<Type*>(comObject)->GetMoniker( dwAssign,dwWhichMoniker,ppmk);
            }
            virtual HRESULT STDMETHODCALLTYPE GetContainer( IOleContainer **ppContainer)
            {
                return static_cast<Type*>(comObject)->GetContainer(ppContainer);
            }
            virtual HRESULT STDMETHODCALLTYPE ShowObject( )
            {
                return static_cast<Type*>(comObject)->ShowObject( );
            }
            virtual HRESULT STDMETHODCALLTYPE OnShowWindow( BOOL fShow)
            {
                return static_cast<Type*>(comObject)->OnShowWindow( fShow);
            }
            virtual HRESULT STDMETHODCALLTYPE RequestNewObjectLayout( )
            {
                return static_cast<Type*>(comObject)->RequestNewObjectLayout( );
            }
        };


        template< typename Type_, typename Interface_ = IOleControl >
        class IOleControlImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleControl InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IOleControlImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IOleControl,this);
            }


            virtual HRESULT STDMETHODCALLTYPE GetControlInfo(CONTROLINFO *pCI)
            {
                return static_cast<Type*>(comObject)->GetControlInfo(pCI);
            }
        
            virtual HRESULT STDMETHODCALLTYPE OnMnemonic(MSG *pMsg)
            {
                return static_cast<Type*>(comObject)->OnMnemonic(pMsg);
            }
        
            virtual HRESULT STDMETHODCALLTYPE OnAmbientPropertyChange(DISPID dispID)
            {
                return static_cast<Type*>(comObject)->OnAmbientPropertyChange(dispID);
            }
        
            virtual HRESULT STDMETHODCALLTYPE FreezeEvents(BOOL bFreeze)
            {
                return static_cast<Type*>(comObject)->FreezeEvents(bFreeze);
            }
        };

        
        template< typename Type_, typename Interface_ = IOleControlSite >
        class IOleControlSiteImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleControlSite InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IOleControlSiteImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE OnControlInfoChanged( )
            {
                return static_cast<Type*>(comObject)->OnControlInfoChanged( );
            }
            virtual HRESULT STDMETHODCALLTYPE LockInPlaceActive( BOOL fLock)
            {
                return static_cast<Type*>(comObject)->LockInPlaceActive( fLock);
            }
            virtual HRESULT STDMETHODCALLTYPE GetExtendedControl( IDispatch **ppDisp)
            {
                return static_cast<Type*>(comObject)->GetExtendedControl( ppDisp);
            }
            virtual HRESULT STDMETHODCALLTYPE TransformCoords( POINTL *pPtlHimetric,POINTF *pPtfContainer, DWORD dwFlags)
            {
                return static_cast<Type*>(comObject)->TransformCoords( pPtlHimetric,pPtfContainer, dwFlags);
            }
            virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( MSG *pMsg,DWORD grfModifiers)
            {
                return static_cast<Type*>(comObject)->TranslateAccelerator( pMsg,grfModifiers);
            }
            virtual HRESULT STDMETHODCALLTYPE OnFocus( BOOL fGotFocus)
            {
                return static_cast<Type*>(comObject)->OnFocus( fGotFocus);
            }
            virtual HRESULT STDMETHODCALLTYPE ShowPropertyFrame( )
            {
                return static_cast<Type*>(comObject)->ShowPropertyFrame();
            }

        };

        
        template< typename Type_, typename Interface_ = IPropertyPage >
        class IPropertyPageImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPropertyPage InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IPropertyPageImpl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE SetPageSite( IPropertyPageSite *pPageSite)
            {
                return static_cast<Type*>(comObject)->SetPageSite( pPageSite);
            }
            virtual HRESULT STDMETHODCALLTYPE Activate( HWND hWndParent,LPCRECT pRect,BOOL bModal)
            {
                return static_cast<Type*>(comObject)->Activate( hWndParent,pRect,bModal);
            }
            virtual HRESULT STDMETHODCALLTYPE Deactivate( )
            {
                return static_cast<Type*>(comObject)->Deactivate( );
            }
            virtual HRESULT STDMETHODCALLTYPE GetPageInfo( PROPPAGEINFO *pPageInfo)
            {
                return static_cast<Type*>(comObject)->GetPageInfo( pPageInfo);
            }
            virtual HRESULT STDMETHODCALLTYPE SetObjects( ULONG cObjects,IUnknown **ppUnk)
            {
                return static_cast<Type*>(comObject)->SetObjects( cObjects,ppUnk);
            }
            virtual HRESULT STDMETHODCALLTYPE Show( UINT nCmdShow)
            {
                return static_cast<Type*>(comObject)->Show( nCmdShow);
            }
            virtual HRESULT STDMETHODCALLTYPE Move( LPCRECT pRect)
            {
                return static_cast<Type*>(comObject)->Move( pRect);
            }
            virtual HRESULT STDMETHODCALLTYPE IsPageDirty( )
            {
                return static_cast<Type*>(comObject)->IsPageDirty( );
            }
            virtual HRESULT STDMETHODCALLTYPE Apply( )
            {
                return static_cast<Type*>(comObject)->Apply( );
            }
            virtual HRESULT STDMETHODCALLTYPE Help( LPCOLESTR pszHelpDir)
            {
                return static_cast<Type*>(comObject)->Help( pszHelpDir);
            }
            virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( MSG *pMsg)
            {
                return static_cast<Type*>(comObject)->TranslateAccelerator( pMsg);
            }
        };

        
        template< typename Type_, typename Interface_ = IPropertyPage2 >
        class IPropertyPage2Impl : public IPropertyPageImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPropertyPage2 InterfaceType;

            typedef IPropertyPageImpl< Type_, Interface_ > Base;
            IPropertyPage2Impl(Type_* theComObject)
                : Base(theComObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE EditProperty( DISPID dispID)
            {
                return static_cast<Type*>(comObject)->EditProperty(dispID);
            }
        };

        
        template< typename Type_, typename Interface_ = IPropertyPageSite >
        class IPropertyPageSiteImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPropertyPageSite InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IPropertyPageSiteImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }
            virtual HRESULT STDMETHODCALLTYPE OnStatusChange(DWORD dwFlags) 
            {
                return static_cast<Type*>(comObject)->OnStatusChange(dwFlags) ;
            }
            virtual HRESULT STDMETHODCALLTYPE GetLocaleID( LCID *pLocaleID) 
            {
                return static_cast<Type*>(comObject)->GetLocaleID( pLocaleID) ;
            }
            virtual HRESULT STDMETHODCALLTYPE GetPageContainer( IUnknown **ppUnk)
            {
                return static_cast<Type*>(comObject)->GetPageContainer(ppUnk);
            }
            virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( MSG *pMsg)
            {
                return static_cast<Type*>(comObject)->TranslateAccelerator(pMsg);
            }
        };
        
        template< typename Type_, typename Interface_ = IPropertyNotifySink >
        class IPropertyNotifySinkImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPropertyNotifySink InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IPropertyNotifySinkImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE OnChanged( DISPID dispID)
            {
                return static_cast<Type*>(comObject)->OnChanged( dispID);
            }
            virtual HRESULT STDMETHODCALLTYPE OnRequestEdit( DISPID dispID)
            {
                return static_cast<Type*>(comObject)->OnRequestEdit( dispID);
            }
        };

        
        template< typename Type_, typename Interface_ = ISpecifyPropertyPages >
        class ISpecifyPropertyPagesImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef ISpecifyPropertyPages InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            ISpecifyPropertyPagesImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetPages(CAUUID *pPages)
            {
                return static_cast<Type*>(comObject)->GetPages(pPages);
            }

        };

        template< typename Type_, typename Interface_ = IOleObject >
        class IOleObjectImpl : public IUnknownImpl< Type_ , Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleObject InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IOleObjectImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IOleObject,this);
            }

            virtual HRESULT STDMETHODCALLTYPE SetClientSite(IOleClientSite *pClientSite)
            {
                return static_cast<Type*>(comObject)->SetClientSite(pClientSite);
            }
            virtual HRESULT STDMETHODCALLTYPE GetClientSite(IOleClientSite **ppClientSite)
            {
                return static_cast<Type*>(comObject)->GetClientSite(ppClientSite);
            }
            virtual HRESULT STDMETHODCALLTYPE SetHostNames( LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
            {
                return static_cast<Type*>(comObject)->SetHostNames( szContainerApp, szContainerObj);
            }
            virtual HRESULT STDMETHODCALLTYPE Close(DWORD dwSaveOption )
            {
                return static_cast<Type*>(comObject)->Close( dwSaveOption );
            }
            virtual HRESULT STDMETHODCALLTYPE SetMoniker(DWORD dwWhichMoniker,IMoniker *pmk)
            {
                return static_cast<Type*>(comObject)->SetMoniker(dwWhichMoniker,pmk);
            }
            virtual HRESULT STDMETHODCALLTYPE GetMoniker( DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
            {
                return static_cast<Type*>(comObject)->GetMoniker( dwAssign, dwWhichMoniker, ppmk);
            }
            virtual HRESULT STDMETHODCALLTYPE InitFromData( IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved)
            {
                return static_cast<Type*>(comObject)->InitFromData( pDataObject, fCreation, dwReserved);
            }
            virtual HRESULT STDMETHODCALLTYPE GetClipboardData( DWORD dwReserved, IDataObject **ppDataObject)
            {
                return static_cast<Type*>(comObject)->GetClipboardData( dwReserved, ppDataObject);
            }
            virtual HRESULT STDMETHODCALLTYPE DoVerb( LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
            {
                return static_cast<Type*>(comObject)->DoVerb( iVerb, lpmsg, pActiveSite, lindex, hwndParent, lprcPosRect);
            }
            virtual HRESULT STDMETHODCALLTYPE EnumVerbs( IEnumOLEVERB **ppEnumOleVerb )
            {
                return static_cast<Type*>(comObject)->EnumVerbs( ppEnumOleVerb );
            }
            virtual HRESULT STDMETHODCALLTYPE Update( )
            {
                return static_cast<Type*>(comObject)->Update( );
            }
            virtual HRESULT STDMETHODCALLTYPE IsUpToDate( )
            {
                return static_cast<Type*>(comObject)->IsUpToDate( );
            }
            virtual HRESULT STDMETHODCALLTYPE GetUserClassID( CLSID *pClsid)
            {
                return static_cast<Type*>(comObject)->GetUserClassID( pClsid );
            }
            virtual HRESULT STDMETHODCALLTYPE GetUserType( DWORD dwFormOfType,LPOLESTR *pszUserType)
            {
                return static_cast<Type*>(comObject)->GetUserType( dwFormOfType,pszUserType);
            }
            virtual HRESULT STDMETHODCALLTYPE SetExtent( DWORD dwDrawAspect,SIZEL *psizel)
            {
                return static_cast<Type*>(comObject)->SetExtent( dwDrawAspect,psizel);
            }
            virtual HRESULT STDMETHODCALLTYPE GetExtent( DWORD dwDrawAspect,SIZEL *psizel)
            {
                return static_cast<Type*>(comObject)->GetExtent( dwDrawAspect,psizel );
            }
            virtual HRESULT STDMETHODCALLTYPE Advise( IAdviseSink *pAdvSink,DWORD *pdwConnection)
            {
                return static_cast<Type*>(comObject)->Advise( pAdvSink, pdwConnection);
            }
            virtual HRESULT STDMETHODCALLTYPE Unadvise( DWORD dwConnection)
            {
                return static_cast<Type*>(comObject)->Unadvise( dwConnection );
            }
            virtual HRESULT STDMETHODCALLTYPE EnumAdvise( IEnumSTATDATA **ppenumAdvise)
            {
                return static_cast<Type*>(comObject)->EnumAdvise( ppenumAdvise );
            }
            virtual HRESULT STDMETHODCALLTYPE GetMiscStatus( DWORD dwAspect, DWORD *pdwStatus)
            {
                return static_cast<Type*>(comObject)->GetMiscStatus( dwAspect, pdwStatus);
            }
            virtual HRESULT STDMETHODCALLTYPE SetColorScheme( LOGPALETTE *pLogpal)
            {
                return static_cast<Type*>(comObject)->SetColorScheme( pLogpal );
            }
        };


        template< typename Type_, typename Interface_ = IOleWindow >
        class IOleWindowImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleWindow InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IOleWindowImpl( Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IOleWindow,this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd)
            {
                return static_cast<Type*>(comObject)->GetWindow( phwnd );
            }
            virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode)
            {
                return static_cast<Type*>(comObject)->ContextSensitiveHelp( fEnterMode );
            }
        };


        template< typename Type_, typename Interface_ = IOleLink >
        class IOleLinkImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleLink InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IOleLinkImpl( Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE SetUpdateOptions( DWORD dwUpdateOpt)
            {
                return static_cast<Type*>(comObject)->SetUpdateOptions( dwUpdateOpt);
            }

            virtual HRESULT STDMETHODCALLTYPE GetUpdateOptions( DWORD *pdwUpdateOpt)
            {
                return static_cast<Type*>(comObject)->GetUpdateOptions( pdwUpdateOpt);
            }

            virtual HRESULT STDMETHODCALLTYPE SetSourceMoniker( IMoniker *pmk,REFCLSID rclsid)
            {
                return static_cast<Type*>(comObject)->SetSourceMoniker( pmk,rclsid);
            }

            virtual HRESULT STDMETHODCALLTYPE GetSourceMoniker( IMoniker **ppmk)
            {
                return static_cast<Type*>(comObject)->GetSourceMoniker( ppmk);
            }
            virtual HRESULT STDMETHODCALLTYPE SetSourceDisplayName( LPCOLESTR pszStatusText)
            {
                return static_cast<Type*>(comObject)->SetSourceDisplayName( pszStatusText);
            }
            virtual HRESULT STDMETHODCALLTYPE GetSourceDisplayName( LPOLESTR *ppszDisplayName)
            {
                return static_cast<Type*>(comObject)->GetSourceDisplayName( ppszDisplayName);
            }
            virtual HRESULT STDMETHODCALLTYPE BindToSource( DWORD bindflags,IBindCtx *pbc)
            {
                return static_cast<Type*>(comObject)->BindToSource( bindflags,pbc);
            }
            virtual HRESULT STDMETHODCALLTYPE BindIfRunning( ) 
            {
                return static_cast<Type*>(comObject)->BindIfRunning( );
            }

            virtual HRESULT STDMETHODCALLTYPE GetBoundSource( IUnknown **ppunk)
            {
                return static_cast<Type*>(comObject)->GetBoundSource( ppunk);
            }

            virtual HRESULT STDMETHODCALLTYPE UnbindSource( )
            {
                return static_cast<Type*>(comObject)->UnbindSource( );
            }
            virtual HRESULT STDMETHODCALLTYPE Update( IBindCtx *pbc)
            {
                return static_cast<Type*>(comObject)->Update( pbc);
            }
        };

        
        template< typename Type_, typename Interface_ = IOleItemContainer >
        class IOleItemContainerImpl : public IOleContainerImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleItemContainer InterfaceType;

            typedef IOleContainerImpl< Type_, Interface_ > Base;
            IOleItemContainerImpl( Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetObject( LPOLESTR pszItem,DWORD dwSpeedNeeded,IBindCtx *pbc,REFIID riid,void **ppvObject)
            {
                return static_cast<Type*>(comObject)->GetObject( pszItem,dwSpeedNeeded,pbc,riid,ppvObject);
            }
            virtual HRESULT STDMETHODCALLTYPE GetObjectStorage( LPOLESTR pszItem,IBindCtx *pbc,REFIID riid,void **ppvStorage)
            {
                return static_cast<Type*>(comObject)->GetObjectStorage( pszItem,pbc,riid,ppvStorage);
            }
            virtual HRESULT STDMETHODCALLTYPE IsRunning( LPOLESTR pszItem)
            {
                return static_cast<Type*>(comObject)->IsRunning( pszItem);
            }
        };


        
        template< typename Type_, typename Interface_ = IOleInPlaceUIWindow >
        class IOleInPlaceUIWindowImpl : public IOleWindowImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleInPlaceUIWindow InterfaceType;

            typedef IOleWindowImpl< Type_, Interface_ > Base;
            IOleInPlaceUIWindowImpl( Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetBorder( LPRECT lprectBorder)
            {
                return static_cast<Type*>(comObject)->GetBorder( lprectBorder);
            }

            virtual HRESULT STDMETHODCALLTYPE RequestBorderSpace( LPCBORDERWIDTHS pborderwidths)
            {
                return static_cast<Type*>(comObject)->RequestBorderSpace( pborderwidths);
            }

            virtual HRESULT STDMETHODCALLTYPE SetBorderSpace( LPCBORDERWIDTHS pborderwidths)
            {
                return static_cast<Type*>(comObject)->SetBorderSpace( pborderwidths);
            }

            virtual HRESULT STDMETHODCALLTYPE SetActiveObject( IOleInPlaceActiveObject *pActiveObject,LPCOLESTR pszObjName)
            {
                return static_cast<Type*>(comObject)->SetActiveObject( pActiveObject,pszObjName);
            }
        };

        
        template< typename Type_, typename Interface_ = IOleInPlaceObject >
        class IOleInPlaceObjectImpl : public IOleWindowImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleInPlaceObject InterfaceType;

            typedef IOleWindowImpl< Type_, Interface_ > Base;
            IOleInPlaceObjectImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IOleInPlaceObject,this);
            }

            virtual HRESULT STDMETHODCALLTYPE InPlaceDeactivate( )
            {
                return static_cast<Type*>(comObject)->InPlaceDeactivate( );
            }
            virtual HRESULT STDMETHODCALLTYPE UIDeactivate( )
            {
                return static_cast<Type*>(comObject)->UIDeactivate( );
            }
            virtual HRESULT STDMETHODCALLTYPE SetObjectRects( LPCRECT lprcPosRect, LPCRECT lprcClipRect)
            {
                return static_cast<Type*>(comObject)->SetObjectRects( lprcPosRect, lprcClipRect);
            }
            virtual HRESULT STDMETHODCALLTYPE ReactivateAndUndo( )
            {
                return static_cast<Type*>(comObject)->ReactivateAndUndo( );
            }
        };


        template< typename Type_, typename Interface_ = IOleInPlaceObjectWindowless >
        class IOleInPlaceObjectWindowlessImpl : public IOleInPlaceObjectImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleInPlaceObjectWindowless InterfaceType;

            typedef IOleInPlaceObjectImpl< Type_, Interface_ > Base;
            IOleInPlaceObjectWindowlessImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IOleInPlaceObject,this);
            }

            virtual HRESULT STDMETHODCALLTYPE OnWindowMessage( UINT msg,WPARAM wParam,LPARAM lParam,LRESULT *plResult)
            {
                return static_cast<Type*>(comObject)->OnWindowMessage( msg,wParam,lParam,plResult);
            }
            virtual HRESULT STDMETHODCALLTYPE GetDropTarget( IDropTarget **ppDropTarget)
            {
                return static_cast<Type*>(comObject)->GetDropTarget( ppDropTarget);
            }
        };

        
        template< typename Type_, typename Interface_ = IOleInPlaceSite >
        class IOleInPlaceSiteImpl : public IOleWindowImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleInPlaceSite InterfaceType;

            typedef IOleWindowImpl< Type_, Interface_ > Base;
            IOleInPlaceSiteImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE CanInPlaceActivate( )
            {
                return static_cast<Type*>(comObject)->CanInPlaceActivate( );
            }
            virtual HRESULT STDMETHODCALLTYPE OnInPlaceActivate( )
            {
                return static_cast<Type*>(comObject)->OnInPlaceActivate( );
            }
            virtual HRESULT STDMETHODCALLTYPE OnUIActivate( )
            {
                return static_cast<Type*>(comObject)->OnUIActivate( );
            }
            virtual HRESULT STDMETHODCALLTYPE GetWindowContext( IOleInPlaceFrame **ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT lprcPosRect,LPRECT lprcClipRect,LPOLEINPLACEFRAMEINFO lpFrameInfo) 
            {
                return static_cast<Type*>(comObject)->GetWindowContext( ppFrame,ppDoc,lprcPosRect,lprcClipRect,lpFrameInfo);
            }
            virtual HRESULT STDMETHODCALLTYPE Scroll( SIZE scrollExtant)
            {
                return static_cast<Type*>(comObject)->Scroll( scrollExtant);
            }
            virtual HRESULT STDMETHODCALLTYPE OnUIDeactivate( BOOL fUndoable)
            {
                return static_cast<Type*>(comObject)->OnUIDeactivate( fUndoable);
            }
            virtual HRESULT STDMETHODCALLTYPE OnInPlaceDeactivate( )
            {
                return static_cast<Type*>(comObject)->OnInPlaceDeactivate( );
            }
            virtual HRESULT STDMETHODCALLTYPE DiscardUndoState( )
            {
                return static_cast<Type*>(comObject)->DiscardUndoState( );
            }
            virtual HRESULT STDMETHODCALLTYPE DeactivateAndUndo( )
            {
                return static_cast<Type*>(comObject)->DeactivateAndUndo( );
            }
            virtual HRESULT STDMETHODCALLTYPE OnPosRectChange( LPCRECT lprcPosRect)
            {
                return static_cast<Type*>(comObject)->OnPosRectChange( lprcPosRect);
            }
        };


        
        template< typename Type_, typename Interface_ = IOleInPlaceSiteEx >
        class IOleInPlaceSiteExImpl : public IOleInPlaceSiteImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleInPlaceSiteEx InterfaceType;

            typedef IOleInPlaceSiteImpl< Type_, Interface_ > Base;
            IOleInPlaceSiteExImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE OnInPlaceActivateEx( BOOL *pfNoRedraw,DWORD dwFlags)
            {
                return static_cast<Type*>(comObject)->OnInPlaceActivateEx( pfNoRedraw,dwFlags);
            }
            virtual HRESULT STDMETHODCALLTYPE OnInPlaceDeactivateEx( BOOL fNoRedraw)
            {
                return static_cast<Type*>(comObject)->OnInPlaceDeactivateEx( fNoRedraw);
            }
            virtual HRESULT STDMETHODCALLTYPE RequestUIActivate( )
            {
                return static_cast<Type*>(comObject)->RequestUIActivate( );
            }
        };

        
        template< typename Type_, typename Interface_ = IOleInPlaceSiteWindowless >
        class IOleInPlaceSiteWindowlessImpl : public IOleInPlaceSiteExImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleInPlaceSiteWindowless InterfaceType;

            typedef IOleInPlaceSiteExImpl< Type_, Interface_ > Base;
            IOleInPlaceSiteWindowlessImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE CanWindowlessActivate( )
            {
                return static_cast<Type*>(comObject)->CanWindowlessActivate( );
            }
            virtual HRESULT STDMETHODCALLTYPE GetCapture( )
            {
                return static_cast<Type*>(comObject)->GetCapture( );
            }
        
            virtual HRESULT STDMETHODCALLTYPE SetCapture( BOOL fCapture)
            {
                return static_cast<Type*>(comObject)->SetCapture( fCapture);
            }
        
            virtual HRESULT STDMETHODCALLTYPE GetFocus( )
            {
                return static_cast<Type*>(comObject)->GetFocus( );
            }
        
            virtual HRESULT STDMETHODCALLTYPE SetFocus( BOOL fFocus)
            {
                return static_cast<Type*>(comObject)->SetFocus( fFocus);
            }
        
            virtual HRESULT STDMETHODCALLTYPE GetDC( LPCRECT pRect,DWORD grfFlags,HDC *phDC)
            {
                return static_cast<Type*>(comObject)->GetDC( pRect,grfFlags,phDC);
            }
        
            virtual HRESULT STDMETHODCALLTYPE ReleaseDC( HDC hDC)
            {
                return static_cast<Type*>(comObject)->ReleaseDC( hDC);
            }
        
            virtual HRESULT STDMETHODCALLTYPE InvalidateRect( LPCRECT pRect,BOOL fErase)
            {
                return static_cast<Type*>(comObject)->InvalidateRect( pRect,fErase);
            }
            virtual HRESULT STDMETHODCALLTYPE InvalidateRgn( HRGN hRGN,BOOL fErase)
            {
                return static_cast<Type*>(comObject)->InvalidateRgn( hRGN,fErase);
            }
        
            virtual HRESULT STDMETHODCALLTYPE ScrollRect( INT dx,INT dy,LPCRECT pRectScroll,LPCRECT pRectClip)
            {
                return static_cast<Type*>(comObject)->ScrollRect( dx,dy,pRectScroll,pRectClip);
            }
        
            virtual HRESULT STDMETHODCALLTYPE AdjustRect( LPRECT prc)
            {
                return static_cast<Type*>(comObject)->AdjustRect( prc);
            }
        
            virtual HRESULT STDMETHODCALLTYPE OnDefWindowMessage( UINT msg,WPARAM wParam,LPARAM lParam,LRESULT *plResult)
            {
                return static_cast<Type*>(comObject)->OnDefWindowMessage( msg,wParam,lParam,plResult);
            }

        };

        
        template< typename Type_, typename Interface_ = IContinue >
        class IContinueImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IContinue InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IContinueImpl( Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE FContinue( void)
            {
                return static_cast<Type*>(comObject)->FContinue();
            }

        };


        template< typename Type_, typename Interface_ = IOleInPlaceActiveObject >
        class IOleInPlaceActiveObjectImpl : public IOleWindowImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleInPlaceActiveObject InterfaceType;

            typedef IOleWindowImpl< Type_, Interface_ > Base;
            IOleInPlaceActiveObjectImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IOleInPlaceActiveObject,this);
            }

            virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpmsg)
            {
                return static_cast<Type*>(comObject)->TranslateAccelerator(lpmsg);
            }
            virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(BOOL fActivate)
            {
                return static_cast<Type*>(comObject)->OnFrameWindowActivate(fActivate);
            }
            virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate( BOOL fActivate)
            {
                return static_cast<Type*>(comObject)->OnDocWindowActivate( fActivate);
            }
            virtual HRESULT STDMETHODCALLTYPE ResizeBorder(LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fFrameWindow)
            {
                return static_cast<Type*>(comObject)->ResizeBorder(prcBorder, pUIWindow, fFrameWindow);
            }
            virtual HRESULT STDMETHODCALLTYPE EnableModeless(BOOL fEnable)
            {
                return static_cast<Type*>(comObject)->EnableModeless(fEnable);
            }

        }; 

        
        template< typename Type_, typename Interface_ = IOleInPlaceFrame >
        class IOleInPlaceFrameImpl : public IOleInPlaceUIWindowImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IOleInPlaceFrame InterfaceType;

            typedef IOleInPlaceUIWindowImpl< Type_, Interface_ > Base;
            IOleInPlaceFrameImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT InsertMenus( HMENU hmenuShared,LPOLEMENUGROUPWIDTHS lpMenuWidths)
            {
                return static_cast<Type*>(comObject)->InsertMenus( hmenuShared,lpMenuWidths);
            }
            virtual HRESULT STDMETHODCALLTYPE SetMenu( HMENU hmenuShared,HOLEMENU holemenu,HWND hwndActiveObject)
            {
                return static_cast<Type*>(comObject)->SetMenu( hmenuShared,holemenu,hwndActiveObject);
            }
            virtual HRESULT STDMETHODCALLTYPE RemoveMenus( HMENU hmenuShared)
            {
                return static_cast<Type*>(comObject)->RemoveMenus( hmenuShared);
            }
            virtual HRESULT STDMETHODCALLTYPE SetStatusText( LPCOLESTR pszStatusText)
            {
                return static_cast<Type*>(comObject)->SetStatusText( pszStatusText);
            }
            virtual HRESULT STDMETHODCALLTYPE EnableModeless( BOOL fEnable)
            {
                return static_cast<Type*>(comObject)->EnableModeless( fEnable);
            }
            virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( LPMSG lpmsg,WORD wID)
            {
                return static_cast<Type*>(comObject)->TranslateAccelerator( lpmsg,wID);
            }
        };

        template< typename Type_, typename Interface_ = IViewObject >
        class IViewObjectImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IViewObject InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IViewObjectImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IViewObject,this);
            }

            virtual HRESULT STDMETHODCALLTYPE Draw( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, BOOL ( STDMETHODCALLTYPE *pfnContinue )( ULONG_PTR dwContinue), ULONG_PTR dwContinue)
            {
                return static_cast<Type*>(comObject)->Draw( dwDrawAspect, lindex, pvAspect, ptd, hdcTargetDev, hdcDraw, lprcBounds, lprcWBounds, pfnContinue , dwContinue);
            }
            virtual HRESULT STDMETHODCALLTYPE GetColorSet( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet)
            {
                return static_cast<Type*>(comObject)->GetColorSet( dwDrawAspect, lindex, pvAspect, ptd, hicTargetDev, ppColorSet);
            }
            virtual HRESULT STDMETHODCALLTYPE Freeze( DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze)
            {
                return static_cast<Type*>(comObject)->Freeze( dwDrawAspect, lindex, pvAspect, pdwFreeze);
            }
            virtual HRESULT STDMETHODCALLTYPE Unfreeze( DWORD dwFreeze)
            {
                return static_cast<Type*>(comObject)->Unfreeze( dwFreeze);
            }
            virtual HRESULT STDMETHODCALLTYPE SetAdvise( DWORD aspects,DWORD advf,IAdviseSink *pAdvSink)
            {
                return static_cast<Type*>(comObject)->SetAdvise( aspects,advf,pAdvSink);
            }
            virtual HRESULT STDMETHODCALLTYPE GetAdvise( DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink)
            {
                return static_cast<Type*>(comObject)->GetAdvise( pAspects, pAdvf, ppAdvSink);
            }
        };


        template< typename Type_, typename Interface_ = IViewObject2 >
        class IViewObject2Impl : public IViewObjectImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IViewObject2 InterfaceType;

            typedef IViewObjectImpl< Type_, Interface_ > Base;
            IViewObject2Impl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IViewObject2,this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetExtent( DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE *ptd, LPSIZEL lpsizel)
            {
                return static_cast<Type*>(comObject)->GetExtent( dwDrawAspect, lindex, ptd, lpsizel);
            }
        };

        template< typename Type_, typename Interface_ = IViewObjectEx >
        class IViewObjectExImpl : public IViewObject2Impl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IViewObjectEx InterfaceType;

            typedef IViewObject2Impl< Type_, Interface_ > Base;
            IViewObjectExImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetRect( DWORD dwAspect,LPRECTL pRect)
            {
                return static_cast<Type*>(comObject)->GetRect( dwAspect,pRect);
            }
            virtual HRESULT STDMETHODCALLTYPE GetViewStatus( DWORD *pdwStatus)
            {
                return static_cast<Type*>(comObject)->GetViewStatus( pdwStatus);
            }
        
            virtual HRESULT STDMETHODCALLTYPE QueryHitPoint( DWORD dwAspect,LPCRECT pRectBounds,POINT ptlLoc,LONG lCloseHint,DWORD *pHitResult)
            {
                return static_cast<Type*>(comObject)->QueryHitPoint( dwAspect,pRectBounds,ptlLoc,lCloseHint,pHitResult);
            }
        
            virtual HRESULT STDMETHODCALLTYPE QueryHitRect( DWORD dwAspect,LPCRECT pRectBounds,LPCRECT pRectLoc,LONG lCloseHint,DWORD *pHitResult)
            {
                return static_cast<Type*>(comObject)->QueryHitRect( dwAspect,pRectBounds,pRectLoc,lCloseHint,pHitResult);
            }
        
            virtual HRESULT STDMETHODCALLTYPE GetNaturalExtent( DWORD dwAspect,LONG lindex,DVTARGETDEVICE *ptd,HDC hicTargetDev,DVEXTENTINFO *pExtentInfo,LPSIZEL pSizel)
            {
                return static_cast<Type*>(comObject)->GetNaturalExtent( dwAspect,lindex,ptd,hicTargetDev,pExtentInfo,pSizel);
            }

        };



        template< typename Type_, typename Interface_ = IOleUndoUnit >
        class IOleUndoUnitImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IOleUndoUnit InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IOleUndoUnitImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE Do( IOleUndoManager *pUndoManager)
            {
                return static_cast<Type*>(comObject)->Do(pUndoManager);
            }
            virtual HRESULT STDMETHODCALLTYPE GetDescription( BSTR *pBstr)
            {
                return static_cast<Type*>(comObject)->GetDescription( pBstr);
            }
        
            virtual HRESULT STDMETHODCALLTYPE GetUnitType( CLSID *pClsid,LONG *plID)
            {
                return static_cast<Type*>(comObject)->GetUnitType( pClsid,plID);
            }
        
            virtual HRESULT STDMETHODCALLTYPE OnNextAdd( )
            {
                return static_cast<Type*>(comObject)->OnNextAdd( );
            }
        };

        
        template< typename Type_, typename Interface_ = IOleParentUndoUnit >
        class IOleParentUndoUnitImpl : public IOleUndoUnitImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IOleParentUndoUnit InterfaceType;

            typedef IOleUndoUnitImpl< Type_, Interface_ > Base;
            IOleParentUndoUnitImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE Open( IOleParentUndoUnit *pPUU)
            {
                return static_cast<Type*>(comObject)->Open( pPUU);
            }
            virtual HRESULT STDMETHODCALLTYPE Close( IOleParentUndoUnit *pPUU,BOOL fCommit)
            {
                return static_cast<Type*>(comObject)->Close( pPUU,fCommit);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Add( IOleUndoUnit *pUU) 
            {
                return static_cast<Type*>(comObject)->Add( pUU) ;
            }
        
            virtual HRESULT STDMETHODCALLTYPE FindUnit( IOleUndoUnit *pUU)
            {
                return static_cast<Type*>(comObject)->FindUnit( pUU);
            }
        
            virtual HRESULT STDMETHODCALLTYPE GetParentState( DWORD *pdwState)
            {
                return static_cast<Type*>(comObject)->GetParentState( pdwState);
            }
        };

        template< typename Type_, typename Interface_ = IEnumOleUndoUnits >
        class IEnumOleUndoUnitsImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IEnumOleUndoUnits InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IEnumOleUndoUnitsImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE Next( ULONG cElt,IOleUndoUnit **rgElt,ULONG *pcEltFetched)
            {
                return static_cast<Type*>(comObject)->Next( cElt,rgElt,pcEltFetched);
            }
            virtual HRESULT STDMETHODCALLTYPE Skip( ULONG cElt)
            {
                return static_cast<Type*>(comObject)->Skip( cElt);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Reset( )
            {
                return static_cast<Type*>(comObject)->Reset( );
            }
        
            virtual HRESULT STDMETHODCALLTYPE Clone( IEnumOleUndoUnits **ppEnum)
            {
                return static_cast<Type*>(comObject)->Clone(ppEnum);
            }
        };

        
        template< typename Type_, typename Interface_ = IOleUndoManager >
        class IOleUndoManagerImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IOleUndoManager InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IOleUndoManagerImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE Open( IOleParentUndoUnit *pPUU)
            {
                return static_cast<Type*>(comObject)->Open( pPUU);
            }
            virtual HRESULT STDMETHODCALLTYPE Close( IOleParentUndoUnit *pPUU,BOOL fCommit)
            {
                return static_cast<Type*>(comObject)->Close( pPUU,fCommit);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Add( IOleUndoUnit *pUU)
            {
                return static_cast<Type*>(comObject)->Add( pUU);
            }
        
            virtual HRESULT STDMETHODCALLTYPE GetOpenParentState( DWORD *pdwState)
            {
                return static_cast<Type*>(comObject)->GetOpenParentState( pdwState);
            }
        
            virtual HRESULT STDMETHODCALLTYPE DiscardFrom( IOleUndoUnit *pUU)
            {
                return static_cast<Type*>(comObject)->DiscardFrom( pUU);
            }
        
            virtual HRESULT STDMETHODCALLTYPE UndoTo( IOleUndoUnit *pUU)
            {
                return static_cast<Type*>(comObject)->UndoTo( pUU);
            }
        
            virtual HRESULT STDMETHODCALLTYPE RedoTo( IOleUndoUnit *pUU)
            {
                return static_cast<Type*>(comObject)->RedoTo( pUU);
            }
        
            virtual HRESULT STDMETHODCALLTYPE EnumUndoable( IEnumOleUndoUnits **ppEnum)
            {
                return static_cast<Type*>(comObject)->EnumUndoable( ppEnum);
            }
        
            virtual HRESULT STDMETHODCALLTYPE EnumRedoable( IEnumOleUndoUnits **ppEnum)
            {
                return static_cast<Type*>(comObject)->EnumRedoable( ppEnum);
            }
        
            virtual HRESULT STDMETHODCALLTYPE GetLastUndoDescription( BSTR *pBstr)
            {
                return static_cast<Type*>(comObject)->GetLastUndoDescription( pBstr);
            }
        
            virtual HRESULT STDMETHODCALLTYPE GetLastRedoDescription( BSTR *pBstr)
            {
                return static_cast<Type*>(comObject)->GetLastRedoDescription( pBstr);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Enable( BOOL fEnable)
            {
                return static_cast<Type*>(comObject)->Enable( fEnable);
            }
        };

        template< typename Type_, typename Interface_ = IPointerInactive >
        class IPointerInactiveImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IPointerInactive InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IPointerInactiveImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetActivationPolicy( DWORD *pdwPolicy)
            {
                return static_cast<Type*>(comObject)->GetActivationPolicy( pdwPolicy);
            }
            virtual HRESULT STDMETHODCALLTYPE OnInactiveMouseMove( LPCRECT pRectBounds,LONG x,LONG y,DWORD grfKeyState)
            {
                return static_cast<Type*>(comObject)->OnInactiveMouseMove( pRectBounds,x,y,grfKeyState);
            }
        
            virtual HRESULT STDMETHODCALLTYPE OnInactiveSetCursor( LPCRECT pRectBounds,LONG x,LONG y,DWORD dwMouseMsg,BOOL fSetAlways)
            {
                return static_cast<Type*>(comObject)->OnInactiveSetCursor( pRectBounds,x,y,dwMouseMsg,fSetAlways);
            }
        };


        template< typename Type_, typename Interface_ = IObjectWithSite >
        class IObjectWithSiteImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IObjectWithSite InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IObjectWithSiteImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE SetSite( IUnknown *pUnkSite)
            {
                return static_cast<Type*>(comObject)->SetSite(pUnkSite);
            }
            virtual HRESULT STDMETHODCALLTYPE GetSite( REFIID riid,void **ppvSite) 
            {
                return static_cast<Type*>(comObject)->GetSite( riid,ppvSite) ;
            }

        };


        
        template< typename Type_, typename Interface_ = IPerPropertyBrowsing >
        class IPerPropertyBrowsingImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IPerPropertyBrowsing InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IPerPropertyBrowsingImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetDisplayString( DISPID dispID,BSTR *pBstr)
            {
                return static_cast<Type*>(comObject)->GetDisplayString( DISPID dispID,BSTR *pBstr);
            }
            virtual HRESULT STDMETHODCALLTYPE MapPropertyToPage( DISPID dispID,CLSID *pClsid)
            {
                return static_cast<Type*>(comObject)->MapPropertyToPage( dispID,pClsid);
            }
            virtual HRESULT STDMETHODCALLTYPE GetPredefinedStrings( DISPID dispID,CALPOLESTR *pCaStringsOut,CADWORD *pCaCookiesOut)
            {
                return static_cast<Type*>(comObject)->GetPredefinedStrings( dispID,pCaStringsOut,pCaCookiesOut);
            }
            virtual HRESULT STDMETHODCALLTYPE GetPredefinedValue( DISPID dispID,DWORD dwCookie,VARIANT *pVarOut)
            {
                return static_cast<Type*>(comObject)->GetPredefinedValue( dispID,dwCookie,pVarOut);
            }
        };

        template< typename Type_, typename Interface_ = IPropertyBag2 >
        class IPropertyBag2Impl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IPropertyBag2 InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IPropertyBag2Impl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE Read( ULONG cProperties,PROPBAG2 *pPropBag,IErrorLog *pErrLog,VARIANT *pvarValue,HRESULT *phrError)
            {
                return static_cast<Type*>(comObject)->Read( cProperties,pPropBag,pErrLog,pvarValue,phrError);
            }
            virtual HRESULT STDMETHODCALLTYPE Write( ULONG cProperties,PROPBAG2 *pPropBag,VARIANT *pvarValue)
            {
                return static_cast<Type*>(comObject)->Write( cProperties,pPropBag,pvarValue);
            }
        
            virtual HRESULT STDMETHODCALLTYPE CountProperties( ULONG *pcProperties)
            {
                return static_cast<Type*>(comObject)->CountProperties( pcProperties);
            }
        
            virtual HRESULT STDMETHODCALLTYPE GetPropertyInfo( ULONG iProperty,ULONG cProperties,PROPBAG2 *pPropBag,ULONG *pcProperties)
            {
                return static_cast<Type*>(comObject)->GetPropertyInfo( iProperty,cProperties,pPropBag,pcProperties);
            }
        
            virtual HRESULT STDMETHODCALLTYPE LoadObject( LPCOLESTR pstrName,DWORD dwHint,IUnknown *pUnkObject,IErrorLog *pErrLog)
            {
                return static_cast<Type*>(comObject)->LoadObject( pstrName,dwHint,pUnkObject,pErrLog);
            }

        };

        
        template< typename Type_, typename Interface_ = IPersist >
        class IPersistImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPersist InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IPersistImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IPersist,this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID)
            {
                return static_cast<Type*>(comObject)->GetClassID(pClassID);
            }
        };


        template< typename Type_, typename Interface_ = IPersistPropertyBag2 >
        class IPersistPropertyBag2Impl : public IPersistImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IPersistPropertyBag2 InterfaceType;

            typedef IPersistPropertyBag2Impl< Type_, Interface_ > Base;
            IPersistPropertyBag2Impl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE InitNew( )
            {
                return static_cast<Type*>(comObject)->InitNew( );
            }

            virtual HRESULT STDMETHODCALLTYPE Load( IPropertyBag2 *pPropBag,IErrorLog *pErrLog)
            {
                return static_cast<Type*>(comObject)->Load( pPropBag,pErrLog);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Save( IPropertyBag2 *pPropBag,BOOL fClearDirty,BOOL fSaveAllProperties)
            {
                return static_cast<Type*>(comObject)->Save( pPropBag,fClearDirty,fSaveAllProperties);
            }
        
            virtual HRESULT STDMETHODCALLTYPE IsDirty( )
            {
                return static_cast<Type*>(comObject)->IsDirty( );
            }

        };


        
        template< typename Type_, typename Interface_ = IPersistMemory >
        class IPersistMemoryImpl : public IPersistImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPersistMemory InterfaceType;

            typedef IPersistImpl< Type_, Interface_ > Base;
            IPersistMemoryImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IPersistStreamInit,this);
            }

            virtual HRESULT STDMETHODCALLTYPE IsDirty( )
            {
                return static_cast<Type*>(comObject)->IsDirty( );
            }

            virtual HRESULT STDMETHODCALLTYPE Load( LPVOID pMem,ULONG cbSize)
            {
                return static_cast<Type*>(comObject)->Load( pMem,cbSize);
            }

            virtual HRESULT STDMETHODCALLTYPE Save( LPVOID pMem,BOOL fClearDirty,ULONG cbSize)
            {
                return static_cast<Type*>(comObject)->Save( pMem,fClearDirty,cbSize);
            }

            virtual HRESULT STDMETHODCALLTYPE GetSizeMax( ULONG *pCbSize)
            {
                return static_cast<Type*>(comObject)->GetSizeMax( pCbSize);
            }

            virtual HRESULT STDMETHODCALLTYPE InitNew( )
            {
                return static_cast<Type*>(comObject)->InitNew( );
            }
        };

        template< typename Type_, typename Interface_ = IPersistStreamInit >
        class IPersistStreamInitImpl : public IPersistImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPersistStreamInit InterfaceType;

            typedef IPersistImpl< Type_, Interface_ > Base;
            IPersistStreamInitImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IPersistStreamInit,this);
            }

            virtual HRESULT STDMETHODCALLTYPE IsDirty( )
            {
                return static_cast<Type*>(comObject)->IsDirty( );
            }
            virtual HRESULT STDMETHODCALLTYPE Load( LPSTREAM pStm)
            {
                return static_cast<Type*>(comObject)->Load( pStm);
            }
            virtual HRESULT STDMETHODCALLTYPE Save( LPSTREAM pStm, BOOL fClearDirty)
            {
                return static_cast<Type*>(comObject)->Save( pStm, fClearDirty);
            }
            virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pCbSize)
            {
                return static_cast<Type*>(comObject)->GetSizeMax(pCbSize);
            }
            virtual HRESULT STDMETHODCALLTYPE InitNew( )
            {
                return static_cast<Type*>(comObject)->InitNew( );
            }

        };


        template< typename Type_, typename Interface_ = IPersistPropertyBag >
        class IPersistPropertyBagImpl : public IPersistImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPersistPropertyBag InterfaceType;

            typedef IPersistImpl< Type_, Interface_ > Base;
            IPersistPropertyBagImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IPersistPropertyBag,this);
            }

            virtual HRESULT STDMETHODCALLTYPE InitNew( )
            {
                return static_cast<Type*>(comObject)->InitNew( );
            }
            virtual HRESULT STDMETHODCALLTYPE Load( IPropertyBag *pPropBag, IErrorLog *pErrorLog)
            {
                return static_cast<Type*>(comObject)->Load( pPropBag, pErrorLog);
            }
            virtual HRESULT STDMETHODCALLTYPE Save( IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
            {
                return static_cast<Type*>(comObject)->Save( pPropBag, fClearDirty, fSaveAllProperties);
            }
        };


        template< typename Type_, typename Interface_ = IPersistStorage >
        class IPersistStorageImpl : public IPersistImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPersistStorage InterfaceType;

            typedef IPersistImpl< Type_, Interface_ > Base;
            IPersistStorageImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IPersistStorage,this);
            }

            virtual HRESULT STDMETHODCALLTYPE IsDirty( )
            {
                return static_cast<Type*>(comObject)->IsDirty( );
            }
            virtual HRESULT STDMETHODCALLTYPE InitNew(IStorage *pStg)
            {
                return static_cast<Type*>(comObject)->InitNew(pStg);
            }
            virtual HRESULT STDMETHODCALLTYPE Load(IStorage *pStg )
            {
                return static_cast<Type*>(comObject)->Load(pStg );
            }
            virtual HRESULT STDMETHODCALLTYPE Save( IStorage *pStgSave, BOOL fSameAsLoad)
            {
                return static_cast<Type*>(comObject)->Save( pStgSave, fSameAsLoad);
            }
            virtual HRESULT STDMETHODCALLTYPE SaveCompleted( IStorage *pStgNew)
            {
                return static_cast<Type*>(comObject)->SaveCompleted( pStgNew);
            }
            virtual HRESULT STDMETHODCALLTYPE HandsOffStorage( )
            {
                return static_cast<Type*>(comObject)->HandsOffStorage( );
            }

        };


        template< typename Type_, typename Interface_ = ISimpleFrameSite >
        class ISimpleFrameSiteImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef ISimpleFrameSite InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            ISimpleFrameSiteImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE PreMessageFilter( HWND hWnd,UINT msg,WPARAM wp,LPARAM lp,LRESULT *plResult,DWORD *pdwCookie)
            {
                return static_cast<Type*>(comObject)->PreMessageFilter( hWnd,msg,wp,lp,plResult,pdwCookie);
            }
            virtual HRESULT STDMETHODCALLTYPE PostMessageFilter( HWND hWnd,UINT msg,WPARAM wp,LPARAM lp,LRESULT *plResult,DWORD dwCookie)
            {
                return static_cast<Type*>(comObject)->PostMessageFilter( hWnd,msg,wp,lp,plResult,dwCookie);
            }
        };

        
        template< typename Type_, typename Interface_ = IAdviseSink >
        class IAdviseSinkImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IAdviseSink InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IAdviseSinkImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual void STDMETHODCALLTYPE OnDataChange( FORMATETC *pFormatetc,STGMEDIUM *pStgmed)
            {
                return static_cast<Type*>(comObject)->OnDataChange( pFormatetc,pStgmed);
            }
            virtual void STDMETHODCALLTYPE OnViewChange( DWORD dwAspect,LONG lindex)
            {
                return static_cast<Type*>(comObject)->OnViewChange( dwAspect,lindex);
            }
        
            virtual void STDMETHODCALLTYPE OnRename( IMoniker *pmk)
            {
                return static_cast<Type*>(comObject)->OnRename( pmk);
            }
        
            virtual void STDMETHODCALLTYPE OnSave( )
            {
                return static_cast<Type*>(comObject)->OnSave( );
            }
        
            virtual void STDMETHODCALLTYPE OnClose( )
            {
                return static_cast<Type*>(comObject)->OnClose( );
            }
        };

        
        template< typename Type_, typename Interface_ = IAdviseSinkEx >
        class IAdviseSinkExImpl : public IAdviseSinkImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IAdviseSinkEx InterfaceType;

            typedef IAdviseSinkImpl< Type_, Interface_ > Base;
            IAdviseSinkExImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual void STDMETHODCALLTYPE OnViewStatusChange( DWORD dwViewStatus)
            {
                return static_cast<Type*>(comObject)->OnViewStatusChange( dwViewStatus);
            }
        };


        template< typename Type_, typename Interface_ = IFont >
        class IFontImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IFont InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IFontImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE get_Name( BSTR *pName)
            {
                return static_cast<Type*>(comObject)->get_Name(pName);
            }
            virtual HRESULT STDMETHODCALLTYPE put_Name( BSTR name)
            {
                return static_cast<Type*>(comObject)->put_Name( name);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Size( CY *pSize)
            {
                return static_cast<Type*>(comObject)->get_Size( pSize);
            }
        
            virtual HRESULT STDMETHODCALLTYPE put_Size( CY size)
            {
                return static_cast<Type*>(comObject)->put_Size( size);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Bold( BOOL *pBold)
            {
                return static_cast<Type*>(comObject)->get_Bold( pBold);
            }
        
            virtual HRESULT STDMETHODCALLTYPE put_Bold( BOOL bold)
            {
                return static_cast<Type*>(comObject)->put_Bold( bold);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Italic( BOOL *pItalic)
            {
                return static_cast<Type*>(comObject)->get_Italic( pItalic);
            }
        
            virtual HRESULT STDMETHODCALLTYPE put_Italic( BOOL italic)
            {
                return static_cast<Type*>(comObject)->put_Italic( italic);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Underline( BOOL *pUnderline)
            {
                return static_cast<Type*>(comObject)->get_Underline( pUnderline);
            }
        
            virtual HRESULT STDMETHODCALLTYPE put_Underline( BOOL underline)
            {
                return static_cast<Type*>(comObject)->put_Underline( underline);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Strikethrough( BOOL *pStrikethrough)
            {
                return static_cast<Type*>(comObject)->get_Strikethrough( pStrikethrough);
            }
        
            virtual HRESULT STDMETHODCALLTYPE put_Strikethrough( BOOL strikethrough)
            {
                return static_cast<Type*>(comObject)->put_Strikethrough( strikethrough);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Weight( SHORT *pWeight)
            {
                return static_cast<Type*>(comObject)->get_Weight( pWeight);
            }
        
            virtual HRESULT STDMETHODCALLTYPE put_Weight( SHORT weight)
            {
                return static_cast<Type*>(comObject)->put_Weight( weight);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Charset(SHORT *pCharset)
            {
                return static_cast<Type*>(comObject)->get_Charset(pCharset);
            }
        
            virtual HRESULT STDMETHODCALLTYPE put_Charset(SHORT charset)
            {
                return static_cast<Type*>(comObject)->put_Charset(charset);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_hFont( HFONT *phFont)
            {
                return static_cast<Type*>(comObject)->get_hFont( phFont);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Clone( IFont **ppFont)
            {
                return static_cast<Type*>(comObject)->Clone( ppFont);
            }
        
            virtual HRESULT STDMETHODCALLTYPE IsEqual( IFont *pFontOther)
            {
                return static_cast<Type*>(comObject)->IsEqual( pFontOther);
            }
        
            virtual HRESULT STDMETHODCALLTYPE SetRatio( LONG cyLogical,LONG cyHimetric)
            {
                return static_cast<Type*>(comObject)->SetRatio( cyLogical,cyHimetric);
            }
        
            virtual HRESULT STDMETHODCALLTYPE QueryTextMetrics( TEXTMETRICOLE *pTM)
            {
                return static_cast<Type*>(comObject)->QueryTextMetrics( pTM);
            }
        
            virtual HRESULT STDMETHODCALLTYPE AddRefHfont( HFONT hFont)
            {
                return static_cast<Type*>(comObject)->AddRefHfont( hFont);
            }
        
            virtual HRESULT STDMETHODCALLTYPE ReleaseHfont( HFONT hFont)
            {
                return static_cast<Type*>(comObject)->ReleaseHfont( hFont);
            }
        
            virtual HRESULT STDMETHODCALLTYPE SetHdc( HDC hDC)
            {
                return static_cast<Type*>(comObject)->SetHdc( hDC);
            }

        };


        
        template< typename Type_, typename Interface_ = IPicture >
        class IPictureImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPicture InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IPictureImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE get_Handle( OLE_HANDLE *pHandle)
            {
                return static_cast<Type*>(comObject)->get_Handle( pHandle);
            }
            virtual HRESULT STDMETHODCALLTYPE get_hPal( OLE_HANDLE *phPal)
            {
                return static_cast<Type*>(comObject)->get_hPal( phPal);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Type( SHORT *pType)
            {
                return static_cast<Type*>(comObject)->get_Type( pType);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Width(OLE_XSIZE_HIMETRIC *pWidth)
            {
                return static_cast<Type*>(comObject)->get_Width(pWidth);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Height( OLE_YSIZE_HIMETRIC *pHeight)
            {
                return static_cast<Type*>(comObject)->get_Height( pHeight);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Render( HDC hDC,LONG x,LONG y,LONG cx,LONG cy,OLE_XPOS_HIMETRIC xSrc,OLE_YPOS_HIMETRIC ySrc,OLE_XSIZE_HIMETRIC cxSrc,OLE_YSIZE_HIMETRIC cySrc,LPCRECT pRcWBounds)
            {
                return static_cast<Type*>(comObject)->Render( hDC,x,y,cx,cy,xSrc,ySrc,cxSrc,cySrc,pRcWBounds);
            }
        
            virtual HRESULT STDMETHODCALLTYPE set_hPal( OLE_HANDLE hPal)
            {
                return static_cast<Type*>(comObject)->set_hPal( hPal);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_CurDC(HDC *phDC)
            {
                return static_cast<Type*>(comObject)->get_CurDC(phDC);
            }
        
            virtual HRESULT STDMETHODCALLTYPE SelectPicture( HDC hDCIn,HDC *phDCOut,OLE_HANDLE *phBmpOut)
            {
                return static_cast<Type*>(comObject)->SelectPicture( hDCIn,phDCOut,phBmpOut);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_KeepOriginalFormat( BOOL *pKeep)
            {
                return static_cast<Type*>(comObject)->get_KeepOriginalFormat( pKeep);
            }
        
            virtual HRESULT STDMETHODCALLTYPE put_KeepOriginalFormat( BOOL keep)
            {
                return static_cast<Type*>(comObject)->put_KeepOriginalFormat( keep);
            }
        
            virtual HRESULT STDMETHODCALLTYPE PictureChanged( )
            {
                return static_cast<Type*>(comObject)->PictureChanged( );
            }
        
            virtual HRESULT STDMETHODCALLTYPE SaveAsFile( LPSTREAM pStream,BOOL fSaveMemCopy,LONG *pCbSize)
            {
                return static_cast<Type*>(comObject)->SaveAsFile( pStream,fSaveMemCopy,pCbSize);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Attributes( DWORD *pDwAttr)
            {
                return static_cast<Type*>(comObject)->get_Attributes( pDwAttr);
            }

        };


        template< typename Type_, typename Interface_ = IPicture2 >
        class IPicture2Impl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPicture2 InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IPicture2Impl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }
            virtual HRESULT STDMETHODCALLTYPE get_Handle( HHANDLE *pHandle)
            {
                return static_cast<Type*>(comObject)->get_Handle( pHandle);
            }
            virtual HRESULT STDMETHODCALLTYPE get_hPal( HHANDLE *phPal)
            {
                return static_cast<Type*>(comObject)->get_hPal( phPal);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Type( SHORT *pType)
            {
                return static_cast<Type*>(comObject)->get_Type( pType);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Width(OLE_XSIZE_HIMETRIC *pWidth)
            {
                return static_cast<Type*>(comObject)->get_Width(pWidth);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Height( OLE_YSIZE_HIMETRIC *pHeight)
            {
                return static_cast<Type*>(comObject)->get_Height( pHeight);
            }
        
            virtual HRESULT STDMETHODCALLTYPE Render( HDC hDC,LONG x,LONG y,LONG cx,LONG cy,OLE_XPOS_HIMETRIC xSrc,OLE_YPOS_HIMETRIC ySrc,OLE_XSIZE_HIMETRIC cxSrc,OLE_YSIZE_HIMETRIC cySrc,LPCRECT pRcWBounds)
            {
                return static_cast<Type*>(comObject)->Render( hDC,x,y,cx,cy,xSrc,ySrc,cxSrc,cySrc,pRcWBounds);
            }
        
            virtual HRESULT STDMETHODCALLTYPE set_hPal( HHANDLE hPal)
            {
                return static_cast<Type*>(comObject)->set_hPal( hPal);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_CurDC( HDC *phDC)
            {
                return static_cast<Type*>(comObject)->get_CurDC( phDC);
            }
        
            virtual HRESULT STDMETHODCALLTYPE SelectPicture( HDC hDCIn,HDC *phDCOut,HHANDLE *phBmpOut)
            {
                return static_cast<Type*>(comObject)->SelectPicture( hDCIn,phDCOut,phBmpOut);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_KeepOriginalFormat( BOOL *pKeep)
            {
                return static_cast<Type*>(comObject)->get_KeepOriginalFormat( pKeep);
            }
        
            virtual HRESULT STDMETHODCALLTYPE put_KeepOriginalFormat( BOOL keep)
            {
                return static_cast<Type*>(comObject)->put_KeepOriginalFormat( keep);
            }
        
            virtual HRESULT STDMETHODCALLTYPE PictureChanged( )
            {
                return static_cast<Type*>(comObject)->PictureChanged( );
            }
        
            virtual HRESULT STDMETHODCALLTYPE SaveAsFile( LPSTREAM pStream,BOOL fSaveMemCopy,LONG *pCbSize)
            {
                return static_cast<Type*>(comObject)->SaveAsFile( pStream,fSaveMemCopy,pCbSize);
            }
        
            virtual HRESULT STDMETHODCALLTYPE get_Attributes( DWORD *pDwAttr)
            {
                return static_cast<Type*>(comObject)->get_Attributes( pDwAttr);
            }
        };

        template< typename Type_, typename Interface_ = IFontEventsDisp >
        class IFontEventsDispImpl : public IDispatchImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IFontEventsDisp InterfaceType;

            typedef IDispatchImpl< Type_, Interface_ > Base;
             IFontEventsDispImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }
        };

        template< typename Type_, typename Interface_ = IFontDisp >
        class IFontDispImpl : public IDispatchImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IFontDisp InterfaceType;

            typedef IDispatchImpl< Type_, Interface_ > Base;
             IFontDispImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }
        };


        template< typename Type_, typename Interface_ = IPictureDisp >
        class IPictureDispImpl : public IDispatchImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IPictureDisp InterfaceType;

            typedef IDispatchImpl< Type_, Interface_ > Base;
             IPictureDispImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }
        };





        template< typename Type_, typename Interface_ = IQuickActivate >
        class IQuickActivateImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IQuickActivate InterfaceType;

            typedef IUnknownImpl< Type_, Interface_ > Base;
            IQuickActivateImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IQuickActivate,this);
            }

            virtual HRESULT STDMETHODCALLTYPE QuickActivate( QACONTAINER *pQaContainer, QACONTROL *pQaControl)
            {
                return static_cast<Type*>(comObject)->QuickActivate( pQaContainer, pQaControl);
            }
            virtual HRESULT STDMETHODCALLTYPE SetContentExtent(LPSIZEL pSizel)
            {
                return static_cast<Type*>(comObject)->SetContentExtent(pSizel);
            }
            virtual HRESULT STDMETHODCALLTYPE GetContentExtent(LPSIZEL pSizel)
            {
                return static_cast<Type*>(comObject)->GetContentExtent(pSizel);
            }

        };

        template< typename Type_, typename Interface_ = IDropTarget >
        class IDropTargetImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IDropTarget InterfaceType;

            typedef IUnknownImpl< Type_ , Interface_> Base;
            IDropTargetImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IDropTarget,this);
            }

            virtual HRESULT STDMETHODCALLTYPE DragEnter( IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
            {
                return static_cast<Type*>(comObject)->DragEnter( pDataObj, grfKeyState, pt, pdwEffect);
            }
            virtual HRESULT STDMETHODCALLTYPE DragOver( DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
            {
                return static_cast<Type*>(comObject)->DragOver( grfKeyState, pt, pdwEffect);
            }
            virtual HRESULT STDMETHODCALLTYPE DragLeave( )
            {
                return static_cast<Type*>(comObject)->DragLeave( );
            }
            virtual HRESULT STDMETHODCALLTYPE Drop( IDataObject *pDataObj,DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
            {
                return static_cast<Type*>(comObject)->Drop( pDataObj,grfKeyState, pt, pdwEffect);
            }
        };


        
        template< typename Type_, typename Interface_ = IDropSourceNotify >
        class IDropSourceNotifyImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IDropSourceNotify InterfaceType;

            typedef IUnknownImpl< Type_ , Interface_> Base;
            IDropSourceNotifyImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE DragEnterTarget( HWND hwndTarget)
            {
                return static_cast<Type*>(comObject)->DragEnterTarget( hwndTarget);
            }
            virtual HRESULT STDMETHODCALLTYPE DragLeaveTarget( )
            {
                return static_cast<Type*>(comObject)->DragLeaveTarget( );
            }
        };

        
        template< typename Type_, typename Interface_ = IEnumOLEVERB >
        class IEnumOLEVERBImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IEnumOLEVERB InterfaceType;

            typedef IUnknownImpl< Type_ , Interface_> Base;
            IEnumOLEVERBImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE Next( ULONG celt,LPOLEVERB rgelt,ULONG *pceltFetched)
            {
                return static_cast<Type*>(comObject)->Next( celt,rgelt,pceltFetched);
            }
            virtual HRESULT STDMETHODCALLTYPE Skip( ULONG celt)
            {
                return static_cast<Type*>(comObject)->Skip(celt);
            }
            virtual HRESULT STDMETHODCALLTYPE Reset( )
            {
                return static_cast<Type*>(comObject)->Reset( );
            }
            virtual HRESULT STDMETHODCALLTYPE Clone( IEnumOLEVERB **ppenum)
            {
                return static_cast<Type*>(comObject)->Clone( ppenum);
            }

        };


        template< typename Type_, typename Interface_ = IDropSource >
        class IDropSourceImpl : public IUnknownImpl< Type_, Interface_ >
        {
            
        public:
            typedef Type_ Type;
            typedef IDropSource InterfaceType;

            typedef IUnknownImpl< Type_ , Interface_> Base;
            IDropSourceImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IDropSource,this);
            }

            virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag( BOOL fEscapePressed, DWORD grfKeyState)
            {
                return static_cast<Type*>(comObject)->QueryContinueDrag( fEscapePressed, grfKeyState);
            }
            virtual HRESULT STDMETHODCALLTYPE GiveFeedback( DWORD dwEffect)
            {
                return static_cast<Type*>(comObject)->GiveFeedback(dwEffect);
            }

        };

        template< typename Type_, typename Interface_ = IEnumConnectionPoints >
        class IEnumConnectionPointsImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IEnumConnectionPoints InterfaceType;

            typedef IUnknownImpl< Type_ , Interface_> Base;
            IEnumConnectionPointsImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IEnumConnectionPoints,this);
            }

            virtual HRESULT STDMETHODCALLTYPE Next( ULONG cConnections,LPCONNECTIONPOINT *ppCP,ULONG *pcFetched)
            {
                return static_cast<Type*>(comObject)->Next( cConnections,ppCP,pcFetched);
            }
            virtual HRESULT STDMETHODCALLTYPE Skip( ULONG cConnections)
            {
                return static_cast<Type*>(comObject)->Skip(cConnections);
            }
            virtual HRESULT STDMETHODCALLTYPE Reset( )
            {
                return static_cast<Type*>(comObject)->Reset( );
            }
            virtual HRESULT STDMETHODCALLTYPE Clone( IEnumConnectionPoints **ppEnum)
            {
                return static_cast<Type*>(comObject)->Clone( ppEnum );
            }
        };


        template< typename Type_, typename Interface_ = IConnectionPointContainer >
        class IConnectionPointContainerImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IConnectionPointContainer InterfaceType;

            typedef IUnknownImpl< Type_ , Interface_> Base;
            IConnectionPointContainerImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IConnectionPointContainer,this);
            }

            virtual HRESULT STDMETHODCALLTYPE EnumConnectionPoints( IEnumConnectionPoints **ppEnum)
            {
                return static_cast<Type*>(comObject)->EnumConnectionPoints( ppEnum );
            }
        
            virtual HRESULT STDMETHODCALLTYPE FindConnectionPoint( REFIID riid, IConnectionPoint **ppCP)
            {
                return static_cast<Type*>(comObject)->FindConnectionPoint( riid, ppCP);
            }
        };

        template< typename Type_, typename Interface_ = IEnumConnections >
        class IEnumConnectionsImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IEnumConnections InterfaceType;

            typedef IUnknownImpl< Type_ , Interface_> Base;
            IEnumConnectionsImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IEnumConnections,this);
            }

            virtual HRESULT STDMETHODCALLTYPE Next( ULONG cConnections,LPCONNECTDATA rgcd,ULONG *pcFetched)
            {
                return static_cast<Type*>(comObject)->Next( cConnections,rgcd,pcFetched);
            }
            virtual HRESULT STDMETHODCALLTYPE Skip( ULONG cConnections)
            {
                return static_cast<Type*>(comObject)->Skip( cConnections);
            }
            virtual HRESULT STDMETHODCALLTYPE Reset( )
            {
                return static_cast<Type*>(comObject)->Reset( );
            }
            virtual HRESULT STDMETHODCALLTYPE Clone( IEnumConnections **ppEnum)
            {
                return static_cast<Type*>(comObject)->Clone( ppEnum );
            }
        };


        template< typename Type_, typename Interface_ = IConnectionPoint >
        class IConnectionPointImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IConnectionPoint InterfaceType;

            typedef IUnknownImpl< Type_ , Interface_> Base;
            IConnectionPointImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(IID_IConnectionPoint,this);
            }

            virtual HRESULT STDMETHODCALLTYPE GetConnectionInterface( IID *pIID)
            {
                return static_cast<Type*>(comObject)->GetConnectionInterface(pIID);
            }
            virtual HRESULT STDMETHODCALLTYPE GetConnectionPointContainer(IConnectionPointContainer **ppCPC)
            {
                return static_cast<Type*>(comObject)->GetConnectionPointContainer(ppCPC);
            }
            virtual HRESULT STDMETHODCALLTYPE Advise( IUnknown *pUnkSink,DWORD *pdwCookie)
            {
                return static_cast<Type*>(comObject)->Advise( pUnkSink,pdwCookie);
            }
            virtual HRESULT STDMETHODCALLTYPE Unadvise( DWORD dwCookie)
            {
                return static_cast<Type*>(comObject)->Unadvise(dwCookie);
            }
            virtual HRESULT STDMETHODCALLTYPE EnumConnections( IEnumConnections **ppEnum)
            {
                return static_cast<Type*>(comObject)->EnumConnections(ppEnum);
            }
        };

        
        template< typename Type_, typename Interface_ = IOleUIObjInfoW >
        class IOleUIObjInfoImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IOleUIObjInfoW InterfaceType;

            typedef IUnknownImpl< Type_ , Interface_> Base;
            IOleUIObjInfoImpl(Type_* theObject)
                : Base(theObject)
            {
                // {66571CAF-F6AB-48B4-ABB0-AE511A3EA068}
                GUID IID_IOleUIObjInfo = { 0x66571caf, 0xf6ab, 0x48b4, { 0xab, 0xb0, 0xae, 0x51, 0x1a, 0x3e, 0xa0, 0x68 } };

                static_cast<Type*>(comObject)->InternalAddInterface(IID_IOleUIObjInfo,this);
            }
        
            virtual HRESULT STDMETHODCALLTYPE GetObjectInfo(DWORD dwObject,DWORD* lpdwObjSize, LPWSTR * lplpszLabel,LPWSTR FAR* lplpszType, LPWSTR * lplpszShortType,LPWSTR * lplpszLocation)
            {
                return static_cast<Type*>(comObject)->GetObjectInfo(dwObject,lpdwObjSize, lplpszLabel,lplpszType, lplpszShortType,lplpszLocation);
            }
            virtual HRESULT STDMETHODCALLTYPE GetConvertInfo(DWORD dwObject,
                CLSID * lpClassID, WORD * lpwFormat,
                CLSID * lpConvertDefaultClassID,
                LPCLSID * lplpClsidExclude, UINT * lpcClsidExclude)
            {
                return static_cast<Type*>(comObject)->GetConvertInfo(dwObject,
                                                    lpClassID, lpwFormat,
                                                    lpConvertDefaultClassID,
                                                    lplpClsidExclude, lpcClsidExclude);
            }
            virtual HRESULT STDMETHODCALLTYPE ConvertObject(DWORD dwObject, REFCLSID clsidNew)
            {
                return static_cast<Type*>(comObject)->ConvertObject(dwObject, clsidNew);
            }
            
            virtual HRESULT STDMETHODCALLTYPE GetViewInfo (DWORD dwObject,HGLOBAL * phMetaPict, DWORD* pdvAspect, int* pnCurrentScale)
            {
                return static_cast<Type*>(comObject)->GetViewInfo (dwObject,phMetaPict, pdvAspect, pnCurrentScale);
            }
            virtual HRESULT STDMETHODCALLTYPE SetViewInfo (DWORD dwObject,HGLOBAL hMetaPict, DWORD dvAspect,int nCurrentScale, BOOL bRelativeToOrig)
            {
                return static_cast<Type*>(comObject)->SetViewInfo (dwObject,hMetaPict, dvAspect,nCurrentScale, bRelativeToOrig);
            }
        };


        template< typename Type_, typename Interface_ = IOleDocumentSite >
        class IOleDocumentSiteImpl : public IUnknownImpl< Type_, Interface_ >
        {
        public:
            typedef Type_ Type;
            typedef IOleDocumentSite InterfaceType;

            typedef IUnknownImpl< Type_ , Interface_> Base;
            IOleDocumentSiteImpl(Type_* theObject)
                : Base(theObject)
            {
                static_cast<Type*>(comObject)->InternalAddInterface(__uuidof(InterfaceType),this);
            }

            virtual HRESULT STDMETHODCALLTYPE ActivateMe(IOleDocumentView *pViewToActivate)
            {
                return static_cast<Type*>(comObject)->ActivateMe(pViewToActivate);
            }
        };



        template <typename ContainerType>
        class ComContainerEnumAdapterBase
        {
            
        public:
            typedef ContainerType container_type;
            typedef typename ContainerType::value_type value_type;
            typedef typename ContainerType::const_iterator const_iterator;
            typedef typename ContainerType::iterator iterator;
        private:
            container_type container;
            const_iterator current;
            size_t size;
            size_t index;
        public:
            ComContainerEnumAdapterBase( const ContainerType& theContainer )
                : container(theContainer)
            {
                current = container.cbegin();
                size = container.size();
                index = 0;
            }

            ComContainerEnumAdapterBase( const ComContainerEnumAdapterBase& theAdapter )
                : container(theAdapter.container)
            {
                index = theAdapter.index;
                current = container.cbegin() + index;
                size = container.size();
            }


            const_iterator Current() const
            {
                return current;
            }

            const_iterator Begin() const
            {
                return container.cbegin();
            }

            const_iterator End()
            {
                return container.cend();
            }


            HRESULT Reset()
            {
                current = container.cbegin();
                index = 0;
            }

            HRESULT Skip(ULONG numberOfElementsToSkip)
            {
                if( numberOfElementsToSkip + index > size )
                {
                    index = size;
                    current = container.cend();
                    return S_FALSE;
                }
                else
                {
                    index += numberOfElementsToSkip;
                    current += numberOfElementsToSkip;
                    return S_OK;
                }
            }

            size_t Remaining() const
            {
                return size - index;
            }

            bool Next()
            {
                if(current == container.cend())
                {
                    current++;
                    index++;
                }
                return current != container.cend();
            }

            bool CanMove() const
            {
                return current != container.cend();
            }

        };

        template <typename ContainerType, typename ComEnumElementType>
        class ComContainerEnumAdapter : public ComContainerEnumAdapterBase<ContainerType>
        {
        public:
            typedef ComContainerEnumAdapterBase<ContainerType> Base;
            typedef ComEnumElementType EnumElementType;

            ComContainerEnumAdapter( const ContainerType& theContainer )
                : Base(theContainer)
            {
            }

            HRESULT AssignTo(ComEnumElementType& destination) const
	        { 
                auto current = Current();
                if(!CanMove())
                {
                    return S_FALSE;
                }
                destination = *current;
                return S_OK;
	        }
        };


        template <typename ContainerType>
        class ComContainerEnumAdapter<ContainerType, VARIANT> : public ComContainerEnumAdapterBase<ContainerType>
        {
        public:
            typedef ComContainerEnumAdapterBase<ContainerType> Base;
            typedef VARIANT EnumElementType;

            ComContainerEnumAdapter( const ContainerType& theContainer )
                : Base(theContainer)
            {
            }

            HRESULT AssignTo(VARIANT& destination) const
	        { 
                auto current = Current();
                if(!CanMove())
                {
                    return S_FALSE;
                }
                const Variant& refVariant = *current;
                auto result = refVariant.AssignTo(destination);
                return result;
	        }
        };

        template <typename ContainerType>
        class ComContainerEnumAdapter<ContainerType, CONNECTDATA> : public ComContainerEnumAdapterBase<ContainerType>
        {
        public:
            typedef ComContainerEnumAdapterBase<ContainerType> Base;
            typedef CONNECTDATA EnumElementType;

            ComContainerEnumAdapter( const ContainerType& theContainer )
                : Base(theContainer)
            {
            }

            HRESULT AssignTo(CONNECTDATA& destination) const
	        { 
                Base::const_iterator current = Current();
                if(!CanMove())
                {
                    return S_FALSE;
                }
                const ConnectData& refConnectData = *current;
                auto result = refConnectData.AssignTo(destination);
                return result;
	        }
        };


        template <typename ContainerType>
        class ComContainerEnumAdapter<ContainerType, IUnknown*> : public ComContainerEnumAdapterBase<ContainerType>
        {
        public:
            typedef ComContainerEnumAdapterBase<ContainerType> Base;
            typedef IUnknown* EnumElementType;

            ComContainerEnumAdapter( const ContainerType& theContainer )
                : Base(theContainer)
            {
            }

            HRESULT AssignTo(EnumElementType& destination) const
	        { 
                Base::const_iterator current = Current();
                if(!CanMove())
                {
                    return S_FALSE;
                }
                const Unknown& refUnknown = *current;
                destination = refUnknown.GetInterfacePointer<IUnknown>();
                destination->AddRef();
                return S_OK;
	        }
        }; 


        template <typename ContainerType>
        class ComContainerEnumAdapter<ContainerType, LPCONNECTIONPOINT> : public ComContainerEnumAdapterBase<ContainerType>
        {
        public:
            typedef ComContainerEnumAdapterBase<ContainerType> Base;
            typedef LPCONNECTIONPOINT EnumElementType;

            ComContainerEnumAdapter( const ContainerType& theContainer )
                : Base(theContainer)
            {
            }

            HRESULT AssignTo(EnumElementType& destination) const
	        { 
                Base::const_iterator current = Current();
                if(!CanMove())
                {
                    return S_FALSE;
                }
                const ConnectionPoint& refConnectionPoint = *current;
                destination = refConnectionPoint.GetInterfacePointer<IConnectionPoint>();
                destination->AddRef();
                return S_OK;
	        }
        };


        template <typename ContainerType>
        class ComContainerEnumAdapter<ContainerType, LPOLESTR> : public ComContainerEnumAdapterBase<ContainerType>
        {
        public:
            typedef ComContainerEnumAdapterBase<ContainerType> Base;
            typedef LPOLESTR EnumElementType;

            ComContainerEnumAdapter( const ContainerType& theContainer )
                : Base(theContainer)
            {
            }

            HRESULT AssignTo(EnumElementType& destination) const
	        { 
                Base::const_iterator current = Current();
                if(!CanMove())
                {
                    return S_FALSE;
                }
                const String& refString = *current;
                ULONG len = ULONG(refString.length() + 1);
                destination = (LPOLESTR)CoTaskMemAlloc(len);
                if (destination == nullptr)
		        {
			        return E_OUTOFMEMORY;
		        }
                if(len == 1)
                {
                    destination[0] = 0;
                }
                else
                {
                    wcscpy_s((wchar_t*)destination,len,refString.c_str());
                    destination[len - 1] = 0;
                }
                return S_OK;
	        }
        };





        /*

        template<>
        class ComCopyPolicy<OLEVERB>
        {
        public:
	        static HRESULT Copy(const OLEVERB* source, OLEVERB* destination)
	        {
		        HRESULT hr = S_OK;
		        *destination = *source;
		        if (source->lpszVerbName == NULL)
		        {
			        return S_OK;
		        }

		        ULONG len = wcslen(source->lpszVerbName)+1;
		        destination->lpszVerbName = (LPOLESTR)CoTaskMemAlloc(len);

		        if (destination->lpszVerbName == NULL)
		        {
			        hr = E_OUTOFMEMORY;
		        }
		        else
		        {
                    wcscpy_s((wchar_t*)destination->lpszVerbName,len,(wchar_t*)source->lpszVerbName);
		        }
		        return hr;
	        }
	        static void Initialize(OLEVERB* p) 
	        { 
                memset(p,0,sizeof(OLEVERB));
	        }
	        static void Destroy(OLEVERB* p) 
	        { 
		        if (p->lpszVerbName)
		        {
			        CoTaskMemFree(p->lpszVerbName);
		        }
	        }
        };

        */



        template <typename Type_, typename ContainerEnumAdapterType ,typename InterfaceImpl >
        class ComEnum : public ComObjectBase
        {
        public:
            typedef ComObjectBase Base;
            typedef typename InterfaceImpl::InterfaceType InterfaceType;
            typedef typename ContainerEnumAdapterType::container_type container_type;
            typedef typename ContainerEnumAdapterType::EnumElementType EnumElementType;
        private:
            InterfaceImpl interfaceImpl;
            ContainerEnumAdapterType containerEnumAdapter;
        public:
            ComEnum(const container_type& theElements)
                  : Base(),
                    interfaceImpl((Type_*)this),
                    containerEnumAdapter(theElements)
            {}

            ComEnum(IUnknown* theOuterUnknown, const container_type& theElements)
                  : Base(theOuterUnknown),
                    interfaceImpl((Type_*)this),
                    containerEnumAdapter(theElements)
            {}

            explicit ComEnum(const ComEnum& other)
                : Base(other),
                  interfaceImpl((Type_*)this),
                  containerEnumAdapter(other.containerEnumAdapter)
            {
            }

            virtual HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid,void ** ppvObject)
            {
                return Base::QueryInterface( riid,ppvObject);
            }

            virtual ULONG STDMETHODCALLTYPE AddRef( )
            {
                return Base::AddRef( );
            }

            virtual ULONG STDMETHODCALLTYPE Release( )
            {
                return Base::Release( );
            }

            HRESULT STDMETHODCALLTYPE Next( ULONG numberOfElementsToFetch,EnumElementType* fetchedElements,ULONG *numberOfFetchedElements)
            {
                if (fetchedElements == NULL || (numberOfElementsToFetch > 1 && numberOfFetchedElements == NULL))
                {
		            return E_POINTER;
                }
                if (numberOfFetchedElements != NULL)
                {
		            *numberOfFetchedElements = 0;
                }
	            
                if(containerEnumAdapter.CanMove() == false)
                {
                    return S_FALSE;
                }

	            size_t numberOfRemainingElements = containerEnumAdapter.Remaining();
                size_t actualNumberOfElementsToFetch;
	            HRESULT result = S_OK;
	            if (numberOfRemainingElements < numberOfElementsToFetch)
                {
                    result = S_FALSE;
                    actualNumberOfElementsToFetch = numberOfRemainingElements;
                }
                else
                {
                    actualNumberOfElementsToFetch = numberOfElementsToFetch;
                }
	
                for(size_t i = 0; i < actualNumberOfElementsToFetch;i++)
	            {
                    result = containerEnumAdapter.AssignTo(fetchedElements[i]);
                    if(FAILED(result))
                    {
                        return result;
                    }
                    if (numberOfFetchedElements != NULL)
                    {
		                *numberOfFetchedElements ++;
                    }

                    if(!containerEnumAdapter.Next())
                    {
                        break;
                    }
	            }
	            return result;
            }
            HRESULT STDMETHODCALLTYPE Skip( ULONG numberOfElementsToSkip )
            {
                return containerEnumAdapter.Skip(numberOfElementsToSkip);
            }
            HRESULT STDMETHODCALLTYPE Reset( )
            {
                return containerEnumAdapter.Reset( );
            }
            HRESULT STDMETHODCALLTYPE Clone( InterfaceType **ppEnum)
            {
                ComEnum* pEnum = new ComEnum(*this);
                auto result = pEnum->InternalQueryInterface(__uuidof(InterfaceType),(void**)ppEnum);
                pEnum->Release();
                return result;
            }
        };

        class ComEnumConnections : 
            public ComEnum<
                    ComEnumConnections,
                    ComContainerEnumAdapter< std::vector<ConnectData> , CONNECTDATA>,
                    IEnumConnectionsImpl<ComEnumConnections> >
        {
        public:
            typedef ComEnum<ComEnumConnections,ComContainerEnumAdapter< std::vector<ConnectData> , CONNECTDATA>,IEnumConnectionsImpl<ComEnumConnections> > Base;

            ComEnumConnections( const std::vector<ConnectData>& theElements)
                  : Base(theElements)
            {
            }

            ComEnumConnections( IUnknown* pOuterUnknown ,const std::vector<ConnectData>& theElements)
                  : Base(pOuterUnknown,theElements)
            {
            }
        };


        class ComEnumConnectionPoints : 
            public ComEnum<
                    ComEnumConnectionPoints,
                    ComContainerEnumAdapter< std::vector<ConnectionPoint> , LPCONNECTIONPOINT>,
                    IEnumConnectionPointsImpl<ComEnumConnectionPoints> >
        {
        public:
            typedef ComEnum<
                    ComEnumConnectionPoints,
                    ComContainerEnumAdapter< std::vector<ConnectionPoint> , LPCONNECTIONPOINT>,
                    IEnumConnectionPointsImpl<ComEnumConnectionPoints> > Base;

            ComEnumConnectionPoints( const std::vector<ConnectionPoint>& theElements)
                  : Base(theElements)
            {
            }

            ComEnumConnectionPoints( IUnknown* pOuterUnknown ,const std::vector<ConnectionPoint>& theElements)
                  : Base(pOuterUnknown,theElements)
            {
            }
        };


        class ComEnumUnknown : 
            public ComEnum<
                    ComEnumUnknown,
                    ComContainerEnumAdapter< std::vector<Unknown> , IUnknown*>,
                    IEnumUnknownImpl<ComEnumUnknown> >
        {
        public:
            typedef ComEnum<
                    ComEnumUnknown,
                    ComContainerEnumAdapter< std::vector<Unknown> , IUnknown*>,
                    IEnumUnknownImpl<ComEnumUnknown> > Base;

            ComEnumUnknown( const std::vector<Unknown>& theElements)
                  : Base(theElements)
            {
            }

            ComEnumUnknown( IUnknown* pOuterUnknown ,const std::vector<Unknown>& theElements)
                  : Base(pOuterUnknown,theElements)
            {
            }
        };





        class ComEnumVARIANT : 
            public ComEnum<
                    ComEnumVARIANT,
                    ComContainerEnumAdapter< std::vector<Variant> , VARIANT>,
                    IEnumVARIANTImpl<ComEnumVARIANT> >
        {
        public:
            typedef ComEnum<
                    ComEnumVARIANT,
                    ComContainerEnumAdapter< std::vector<Variant> , VARIANT>,
                    IEnumVARIANTImpl<ComEnumVARIANT> > Base;

            ComEnumVARIANT( const std::vector<Variant>& theElements)
                  : Base(theElements)
            {
            }

            ComEnumVARIANT( IUnknown* pOuterUnknown ,const std::vector<Variant>& theElements)
                  : Base(pOuterUnknown,theElements)
            {
            }
        };


        class ComEnumString : 
            public ComEnum<
                    ComEnumString,
                    ComContainerEnumAdapter< std::vector<String> , LPOLESTR>,
                    IEnumStringImpl<ComEnumString> >
        {
        public:
            typedef ComEnum<
                    ComEnumString,
                    ComContainerEnumAdapter< std::vector<String> , LPOLESTR>,
                    IEnumStringImpl<ComEnumString> > Base;

            ComEnumString( const std::vector<String>& theElements)
                  : Base(theElements)
            {
            }

            ComEnumString( IUnknown* pOuterUnknown ,const std::vector<String>& theElements)
                  : Base(pOuterUnknown,theElements)
            {
            }
        };








    };
};



#endif // __HWINOBJIMPL_H__

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect Sea Surveillance AS
Norway Norway
Chief Architect - Sea Surveillance AS.

Specializing in integrated operations and high performance computing solutions.

I’ve been fooling around with computers since the early eighties, I’ve even done work on CP/M and MP/M.

Wrote my first “real” program on a BBC micro model B based on a series in a magazine at that time. It was fun and I got hooked on this thing called programming ...

A few Highlights:

  • High performance application server development
  • Model Driven Architecture and Code generators
  • Real-Time Distributed Solutions
  • C, C++, C#, Java, TSQL, PL/SQL, Delphi, ActionScript, Perl, Rexx
  • Microsoft SQL Server, Oracle RDBMS, IBM DB2, PostGreSQL
  • AMQP, Apache qpid, RabbitMQ, Microsoft Message Queuing, IBM WebSphereMQ, Oracle TuxidoMQ
  • Oracle WebLogic, IBM WebSphere
  • Corba, COM, DCE, WCF
  • AspenTech InfoPlus.21(IP21), OsiSoft PI


More information about what I do for a living can be found at: harlinn.com or LinkedIn

You can contact me at espen@harlinn.no

Comments and Discussions