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; };