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