stl-based collection with contained notation
От: Andrew S Россия http://alchemy-lab.com
Дата: 24.04.06 20:25
Оценка:
Всем привет.

Есть некий объект, содержащий в себе набор других объектов. Соответственно, надо это дело представить в виде COM коллекции. Просмотрел множество статей, в т.ч. и приведенный здесь перевод мануала из MSDN, но ничего подходящего не нашел. В общем, проще пояснить на примерах, что есть и что надо
Сейчас сделал это следующим образом:
1. Определил класс CMyCollection
2. Отнаследовал его от


ICollectionOnSTLImplEx<
                IDispatchImpl<IMyCollection, &IID_IMyCollection, &LIBID_Lib>,
                std::vector<CComPtr<IMyCollectionItem> >,
                IMyCollectionItem *,
                _CopyInterface<IMyCollectionItem>,
                CComEnumOnSTL<CComIEnum<VARIANT>, &IID_IEnumVARIANT, VARIANT, _CopyVariantFromInterface<IMyCollectionItem>, std::vector<CComPtr<IMyCollectionItem> > > 
     >

3. В объекте, который держит коллекцию, создаю экземпляр коллекции CreateInstance и держу его в CComPtr<IMyCollection> >.
4. Определяю проперть MyCollection, отдавая коллекцию при помощи

STDMETHODIMP CHoster::get_MyCollection(IMyCollection **RHS)
{
    m_pMyCollection.CopyTo(RHS);


Это все работает. Но беда в том, что количество объектов, держащих коллекцию, может быть приличным, в связи с чем хотелось бы достичь... эээ.. некоторой оптимальности их хранения. Хочется сделать как в оригинальном stl коде — хранить коллекцию непосредственно в объекте, а не создавать динамически.
Попробовал сделать след. образом
1. В объект добавляю CComContainedObject<CMyCollection> m_theCollection;
2. В конструкторе пишу m_theCollection(this)
3. отдаю коллекцию при помощи

STDMETHODIMP CHoster::get_MyCollection(IMyCollection **RHS)
{
    return m_theFuzzyBases.QueryInterface(RHS);


Соответственно, при вызове object.MyCollection скрипт ругается, что объект не поддерживает свойство или метод (QueryInterface отрабатывает правильно).
Можно ли добиться желаемой функциональности средствами ATL, может, что где подкрутить? Очень не хочется создавать коллекции динамически, ведь это совсем лишнее

И попутно второй вопрос. Может кто посоветует набор визардов\фреймворков для реализации коллекций на ATL? А то стандартные довольно ущербны, да и много руками тоже неинтересно.
Спасибо!
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.