Example 3:
Avoiding the IEnumVARIANT interface
typedef CComEnum<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > VarArrEnum; STDMETHODIMP CPixels::get__NewEnum(IUnknown **pVal) { // Create an array of VT_DISPATCH for each pixel HRESULT hr; long height = m_pBitmap->m_height; long width = m_pBitmap->m_width; long iVariant = 0; VARIANT* pVars = new VARIANT[width*height]; if (pVars == NULL) return E_OUTOFMEMORY; // Create a pixel in a VT_DISPATCH for each pixel of the array for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { // Create this pixel object VariantInit(&pVars[iVariant]); pVars[iVariant].vt = VT_DISPATCH; hr = get_Pixel(x, y, (IPixel**) &pVars[iVariant++].pdispVal); // Abort creation if anything failed if (FAILED(hr)) { delete pVars; return hr; } } } // Create a pixel for each bitmap and add it to collection CComObject<VarArrEnum>* pPixelsColl; hr = CComObject<VarArrEnum>::CreateInstance(&pPixelsColl); if (SUCCEEDED(hr)) { if (SUCCEEDED(hr = pPixelsColl->Init( pVars, pVars + (width*height), NULL, AtlFlagCopy))) { hr = pPixelsColl->QueryInterface(pVal); } } // Free our local copy of the VARIANT array delete pVars; return hr; }