SOL9 2.0 Class: EnumVariant

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * EnumVariant.h 
 * Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */


//2009/12/04

#pragma once

#include <sol/Object.h>
#include <objbase.h>
#include <sol/com/ComIUnknown.h>

#pragma comment(lib, "oleaut32.lib")


namespace SOL {

class EnumVariant :public ComIUnknown {


public:
    EnumVariant(IUnknown* pUnk=NULL)
    :ComIUnknown(pUnk)
    {

    }

public:
    ~EnumVariant() 
    {
    }

public:
    IEnumVARIANT* get()
    {
        return (IEnumVARIANT*)getIUnknown();
    }

public:
    EnumVariant& operator=(IEnumVARIANT* pEnum)
    { 
        set(pEnum);
        return *this;
    }

public:

    ULONG next( 
               __in  ULONG celt,
               __out VARIANT *rgVar)
    {
        HRESULT hr = E_FAIL;
        IEnumVARIANT* pEnum = get();
            
        ULONG celtFetched = 0;

        if (FAILED(hr = pEnum -> Next( 
                celt,
                rgVar,
                &celtFetched))) {
            throw hr;
        }
        return celtFetched;
    }

public:
    
    IDispatch* next() 
     {
        HRESULT hr = E_FAIL;

        IDispatch *pDisp = NULL;

        IEnumVARIANT* pEnum = get();
        VARIANT vVar;
        VariantInit(&vVar);
        ULONG celtFetched = 0;
        ULONG celt = 1;

        if (FAILED(hr = pEnum -> Next( 
                celt,
                &vVar,
                &celtFetched))) {
            throw hr;
        }
        //Check Variant type
        if (vVar.vt==VT_DISPATCH && celtFetched == 1) {
            //If vt were VT DISPATCH
            pDisp =V_DISPATCH(&vVar);
        } else {
            throw E_POINTER;
        }
        
        return pDisp;
    }

public:
    ULONG next(
               __in  ULONG celt,
               __out IDispatch **ppDisp)
    {
        HRESULT hr = E_FAIL;
        IEnumVARIANT* pEnum = get();
        VARIANT vVar;
        VariantInit(&vVar);
        ULONG celtFetched = 0;

        if (FAILED(hr = pEnum-> Next( 
                celt,
                &vVar,
                &celtFetched))) {
            throw hr;
        }
        //Check Variant type
        if (vVar.vt==VT_DISPATCH && celtFetched > 0) {
            //If vt were VT DISPATCH
            *ppDisp =V_DISPATCH(&vVar);
        } else {
            throw E_POINTER;
        }
        return celtFetched;
    }

public:
    HRESULT next( 
               __in  ULONG celt,
               __out VARIANT *rgVar,
            __out ULONG *pCeltFetched)
    {
        HRESULT hr = E_FAIL;
        IEnumVARIANT* pEnum = get();

        if (FAILED(hr = pEnum -> Next( 
                celt,
                rgVar,
                pCeltFetched))) {
            throw hr;
        }
        return hr;
    }

public:
    HRESULT skip( 
               __in ULONG celt)
    {
        HRESULT hr = E_FAIL;
        IEnumVARIANT* pEnum = get();

        if (FAILED(hr = pEnum-> Skip(celt))) {
            throw hr;
        }
        return hr;
    }
        

public:
    HRESULT reset()
    {
        HRESULT hr = E_FAIL;
        IEnumVARIANT* pEnum = get();
        
        if (FAILED(hr = pEnum->Reset())) {
            throw hr;
        }
        return hr;
    }
        

public:
    HRESULT clone( 
            __out IEnumVARIANT **ppEnum)        
    {
        HRESULT hr = E_FAIL;
        IEnumVARIANT* pEnum = get();

        if (FAILED(hr = pEnum -> Clone(ppEnum))) {
            throw hr;
        }
        return hr;
    }

};

}

Last modified: 1 Feb 2012

Copyright (c) 2009-2012 Antillia.com ALL RIGHTS RESERVED.