Listing 7: DirectoryPartsCollection class.

struct dirparts_proxy_traits
{
  static CComVariant make_value(const recls_strptrs_t &ptr);
};
typedef stlsoft::proxy_sequence < const recls_strptrs_t, CComVariant
                      , dirparts_proxy_traits> directory_parts_type;
typedef CComEnumOnSTL           < IEnumVARIANT, &IID_IEnumVARIANT, VARIANT,
                                _Copy<VARIANT>, directory_parts_type>     
                                  Enumerator_t;
typedef ICollectionOnSTLImpl    < IDirectoryPartsCollection, 
                                directory_parts_type, VARIANT, _Copy<VARIANT>,
                                Enumerator_t>     
                                Collection_t;
class ATL_NO_VTABLE DirectoryPartsCollection
  : public CComObjectRootEx<CComMultiThreadModelNoCS>
  , public IDispatchImpl<Collection_t, 
           &IID_IDirectoryPartsCollection, &LIBID_RECLS_COMLib>
  , public atlstl::SupportErrorInfoImpl<&IID_IDirectoryPartsCollection>
{
public:
  DirectoryPartsCollection()
    : m_punkOwner(NULL)
  {}
  ~DirectoryPartsCollection();
  HRESULT Init(LPUNKNOWN punkOwner, directory_parts_type &parts)
  {
    m_punkOwner = punkOwner;
    if(NULL != m_punkOwner)
    {
      m_punkOwner->AddRef();
    }
    m_coll = parts; // Copy STL collection
    return S_OK;
  }
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(DirectoryPartsCollection)
  COM_INTERFACE_ENTRY(IDirectoryPartsCollection)
  COM_INTERFACE_ENTRY(IDispatch)
  COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
// Members
private:
  LPUNKNOWN m_punkOwner;
};