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