Как подписаться на события нескольких объектов?
От: TarasKo Голландия  
Дата: 15.03.06 10:29
Оценка:
Допустим у меня есть COM-класс который наследуется от IDispEventImpl

class CPaneTopT : 
    ...
    public IDispEventImpl<1, T, &DIID__IRSSink, &LIBID_P4Lib, 
        P4TypeLibMajorVersion, P4TypeLibMinorVersion>,
    ...


и у меня есть вектор однотипных объектов каждый из которых может возбуждать события интерфейса _IRSSink. В своём классе CPaneTopT я описываю SINK_MAP

    ...
    BEGIN_SINK_MAP(T)
        SINK_ENTRY_EX(1, DIID__IRSSink, 1, onObjectsAdded)
        SINK_ENTRY_EX(1, DIID__IRSSink, 2, onObjectsRemoved)
        SINK_ENTRY_EX(1, DIID__IRSSink, 3, onObjectsReplaced)
        SINK_ENTRY_EX(1, DIID__IRSSink, 4, onAllObjectsRemoved)
        SINK_ENTRY_EX(1, DIID__IRSSink, 5, onObjectChanged)
    END_SINK_MAP()
    ...


И теперь мне хочеться подписать мой класс на события объектов в вышеназванном векторе. Просто вызывать последовательно DispEventAdvise для каждого объекта, не работает. там возникает assert, что cookie внутри IDispEventAdvise содержит корректное значение и сначало нужно отписаться от событий объекта. Есть конечно мысль вопользоваться AtlAdvise и хранить у себя вектор соответствующих cookie, но тогда мне кажется не будут вызываться методы описанные в SINK_MAP. (или всё-таки будут?, просто долго достаточно переделывать всё и хочу заранее быть уверенным, что всё будет работать) Вообщем кто сталкивался с такой ситуацией, может знаете как сделать так что бы было лучше всего
Re: Как подписаться на события нескольких объектов?
От: Left2 Украина  
Дата: 15.03.06 10:34
Оценка:
TK>И теперь мне хочеться подписать мой класс на события объектов в вышеназванном векторе. Просто вызывать последовательно DispEventAdvise для каждого объекта, не работает. там возникает assert, что cookie внутри IDispEventAdvise содержит корректное значение и сначало нужно отписаться от событий объекта. Есть конечно мысль вопользоваться AtlAdvise и хранить у себя вектор соответствующих cookie, но тогда мне кажется не будут вызываться методы описанные в SINK_MAP. (или всё-таки будут?, просто долго достаточно переделывать всё и хочу заранее быть уверенным, что всё будет работать) Вообщем кто сталкивался с такой ситуацией, может знаете как сделать так что бы было лучше всего

Вполне реально подточить класс напильником чтобы подписаться к нескольким клиентам. Но у тебя может возникнуть ситуация когда тебе прийдётся отличать от какого из подписанных клиентов пришло событие, тогда без "подтачивания" источника событий не обойтись. Так что если у тебя не миллионы обьектов которые генерят события то проще забить на это дело и иметь по подписчику на обьект.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Как подписаться на события нескольких объектов?
От: Аноним  
Дата: 15.03.06 10:37
Оценка:
Здравствуйте, Left2, Вы писали:

TK>>И теперь мне хочеться подписать мой класс на события объектов в вышеназванном векторе. Просто вызывать последовательно DispEventAdvise для каждого объекта, не работает. там возникает assert, что cookie внутри IDispEventAdvise содержит корректное значение и сначало нужно отписаться от событий объекта. Есть конечно мысль вопользоваться AtlAdvise и хранить у себя вектор соответствующих cookie, но тогда мне кажется не будут вызываться методы описанные в SINK_MAP. (или всё-таки будут?, просто долго достаточно переделывать всё и хочу заранее быть уверенным, что всё будет работать) Вообщем кто сталкивался с такой ситуацией, может знаете как сделать так что бы было лучше всего


L>Вполне реально подточить класс напильником чтобы подписаться к нескольким клиентам. Но у тебя может возникнуть ситуация когда тебе прийдётся отличать от какого из подписанных клиентов пришло событие, тогда без "подтачивания" источника событий не обойтись. Так что если у тебя не миллионы обьектов которые генерят события то проще забить на это дело и иметь по подписчику на обьект.


У меня не миллионы, однако сколько их там 5 или 10 заранее не известно. Потому увы не могу отнаследоваться от 10 IDispEventImpl и радоваться жизни
Re[3]: Как подписаться на события нескольких объектов?
От: Left2 Украина  
Дата: 15.03.06 10:42
Оценка:
А>У меня не миллионы, однако сколько их там 5 или 10 заранее не известно. Потому увы не могу отнаследоваться от 10 IDispEventImpl и радоваться жизни

Ну а сделать 10 обьектов каждый из которых реализует IDispEventImpl?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Как подписаться на события нескольких объектов?
От: algol Россия about:blank
Дата: 15.03.06 10:43
Оценка: 2 (1)
Здравствуйте, TarasKo, Вы писали:

TK>И теперь мне хочеться подписать мой класс на события объектов в вышеназванном векторе. Просто вызывать последовательно DispEventAdvise для каждого объекта, не работает. там возникает assert, что cookie внутри IDispEventAdvise содержит корректное значение и сначало нужно отписаться от событий объекта. Есть конечно мысль вопользоваться AtlAdvise и хранить у себя вектор соответствующих cookie, но тогда мне кажется не будут вызываться методы описанные в SINK_MAP. (или всё-таки будут?, просто долго достаточно переделывать всё и хочу заранее быть уверенным, что всё будет работать) Вообщем кто сталкивался с такой ситуацией, может знаете как сделать так что бы было лучше всего


IDispEventMultiImpl
Автор: asheff
Дата: 12.02.04
Re[2]: Как подписаться на события нескольких объектов?
От: TarasKo Голландия  
Дата: 15.03.06 10:46
Оценка:
Здравствуйте, algol, Вы писали:

A>Здравствуйте, TarasKo, Вы писали:


TK>>И теперь мне хочеться подписать мой класс на события объектов в вышеназванном векторе. Просто вызывать последовательно DispEventAdvise для каждого объекта, не работает. там возникает assert, что cookie внутри IDispEventAdvise содержит корректное значение и сначало нужно отписаться от событий объекта. Есть конечно мысль вопользоваться AtlAdvise и хранить у себя вектор соответствующих cookie, но тогда мне кажется не будут вызываться методы описанные в SINK_MAP. (или всё-таки будут?, просто долго достаточно переделывать всё и хочу заранее быть уверенным, что всё будет работать) Вообщем кто сталкивался с такой ситуацией, может знаете как сделать так что бы было лучше всего


A>IDispEventMultiImpl
Автор: asheff
Дата: 12.02.04


Здорово! Попробую его использовать. Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.