COLLECT.CPP (BROWSEH OLE Sample)

/*************************************************************************

  • OLE Automation TypeLibrary Browse Helper Sample

  • collect.cpp

  • CCollection implementation

  • Written by Microsoft Product Support Services, Windows Developer Support

  • (c) Copyright Microsoft Corp. 1994 All Rights Reserved

  • ***********************************************************************/

#include <windows.h>

#include <windowsx.h>

#ifdef WIN16

#include <ole2.h>

#include <compobj.h>

#include <dispatch.h>

#include <variant.h>

#include <olenls.h>

#endif

#include "browseh.h"

/*

* CCollection::Create

*

* Purpose:

* Creates an instance of a collection object and initializes it.

*

* Parameters:

* lMaxSize Maximum number of items that can added to collection.

* lLBound Lower bound of index of collection.

* ppCollection Returns collection object.

*

* Return Value:

* HRESULT

*

*/

HRESULT

CCollection::Create(ULONG lMaxSize, long lLBound, CCollection FAR* FAR* ppCollection)

{

HRESULT hr;

CCollection FAR* pCollection = NULL;

SAFEARRAYBOUND sabound[1];

*ppCollection = NULL;

// Create new collection

pCollection = new CCollection();

if (pCollection == NULL)

goto error;

// Load type information for the collection from type library.

hr = pCollection->LoadTypeInfo(IID_ICollection);

if (FAILED(hr))

goto error;

// If lMaxSize is 0 increment it to 1 or SafeArrayCreate will fail

if (lMaxSize == 0)

lMaxSize = 1;

pCollection->m_cMax = lMaxSize;

pCollection->m_cElements = 0;

pCollection->m_lLBound = lLBound;

// Create a safe array which is used to implement the collection

sabound[0].cElements = lMaxSize;

sabound[0].lLbound = lLBound;

pCollection->m_psa = SafeArrayCreate(VT_VARIANT, 1, sabound);

if (pCollection->m_psa == NULL)

{

hr = ResultFromScode(E_OUTOFMEMORY);

goto error;

}

#ifdef _DEBUG

lstrcpyn(pCollection->m_szClassName, TEXT("Collection"), 100);

#endif

*ppCollection = pCollection;

return NOERROR;

error:

if (pCollection == NULL)

return ResultFromScode(E_OUTOFMEMORY);

if (pCollection->m_psa)

SafeArrayDestroy(pCollection->m_psa);

pCollection->m_psa = NULL;

delete pCollection;

return hr;

}

/*

* CCollection::CCollection

*

* Purpose:

* Constructor for CCollection object. Initializes members to NULL.

*

*/

CCollection::CCollection()

{

m_psa = NULL;

}

/*

* CCollection::~CCollection

*

* Purpose:

* Destructor for CCollection object.

*

*/

CCollection::~CCollection()

{

if (m_psa) SafeArrayDestroy(m_psa);

}

STDMETHODIMP_(REFCLSID)

CCollection::GetInterfaceID()

{

return IID_ICollection;

}

/*

* CCollection::get_Count

*

* Purpose:

* Returns number of items in collection.

*

*/

STDMETHODIMP_(long)

CCollection::get_Count(void)

{

return m_cElements;

}

/*

* CCollection::get_Item

*

* Purpose:

* Retrieves item from collection, given an index.

*

* Parameters:

* lIndex Index of item to be retrieved.

*

* Returns

* IDispatch of item retrieved from collection.

*

*/

STDMETHODIMP_(LPDISPATCH)

CCollection::get_Item(long lIndex)

{

HRESULT hr;

VARIANT v;

LPDISPATCH pdisp = NULL;

// Check if integer index is within range

if (lIndex < m_lLBound || lIndex >= (long)(m_lLBound+m_cElements))

{RaiseException(IDS_InvalidIndex); return NULL;}

// Retrieve and return item. Note that SafeArrayGetElement AddRefs so an additional AddRef

// is not required.

VariantInit(&v);

hr = SafeArrayGetElement(m_psa, &lIndex, &v);

if (FAILED(hr))

{RaiseException(IDS_Unexpected); return NULL;}

return V_DISPATCH(&v);

}

/*

* CCollection::get_NewEnum

*

* Purpose:

* Returns an enumerator (IEnumVARIANT) for the items curently in the collection.

* The NewEnum property is restricted and so is invisible to users of an

* automation controller's scripting language. Automation controllers that support

* a 'For Each' statement to iterate through the elements of a collection will use

* the enumerator returned by NewEnum. The enumerator creates a snapshot of the

* the current state of the collection.

*

*/

STDMETHODIMP_(LPUNKNOWN)

CCollection::get__NewEnum(void)

{

CEnumVariant FAR* penum = NULL;;

LPUNKNOWN punkEnumVariant = NULL;

HRESULT hr;

// Create new enumerator for items currently in collection and QI for IUnknown

hr = CEnumVariant::Create(m_psa, m_cElements, &penum);

if (FAILED(hr))

{RaiseException(IDS_OutOfMemory); goto error;}

hr = penum->QueryInterface(IID_IUnknown, (VOID FAR* FAR*)&punkEnumVariant);

if (FAILED(hr))

{RaiseException(IDS_Unexpected); goto error;}

return punkEnumVariant;

error:

if (penum)

delete penum;

return NULL;

}

/*

* CCollection::Add

*

* Purpose:

* Adds an item to the collection.

*

* Parameters:

* pdispItemAdd Item to be added to collection.

*

*/

STDMETHODIMP_(void)

CCollection::Add(LPDISPATCH pdispItem)

{

HRESULT hr;

LONG l;

VARIANT v;

// Is the collection full?

if (m_cElements == m_cMax)

{RaiseException(IDS_CollectionFull); return;}

l = m_lLBound+m_cElements;

VariantInit(&v);

V_VT(&v) = VT_DISPATCH;

V_DISPATCH(&v) = pdispItem;

hr = SafeArrayPutElement(m_psa, &l, &v);

if (FAILED(hr))

{RaiseException(IDS_Unexpected); return;}

m_cElements++;

}

Software for developers
Delphi Components
.Net Components
Software for Android Developers
More information resources
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
Databases for Amazon shops developers
Amazon Categories Database
Browse Nodes Database