Здравствуйте, Dizel, Вы писали:
D>Есть класс:
D>class COfficeBtnHandler: D> public IDispEventImpl< D> /*nID*/ 1, COfficeBtnHandler, D> &__uuidof(Office::_CommandBarButtonEvents), D> &__uuidof(Office::__Office), D> /*wMajor*/ OFFICELIB_MAJOR_VERSION, D> /*wMinor*/ OFFICELIB_MINOR_VERSION> D>{ D>public: D> COfficeBtnHandler(void) {} D> virtual ~COfficeBtnHandler(void) {}
D> // Event Handler D> void __stdcall OnClick ( D> /*[in]*/ struct Office::_CommandBarButton * Ctrl, D> /*[in,out]*/ VARIANT_BOOL * CancelDefault );
D>А в ответ — тишина... Кнопка создается и можно хоть обкликаться — молчание...
С большой вероятностью можно предположить, что причина в одном из глюков IDispEventImpl. Проще всего будет перейти на IDispEventSimpleImpl. Но если хочется сексу, то делай поиск в KB по словам IDispEventImpl bug и правь исходники ATL согласно найденным рекомендациям. Может помочь (а может и нет).
Здравствуйте, algol, Вы писали:
A>С большой вероятностью можно предположить, что причина в одном из глюков IDispEventImpl. Проще всего будет перейти на IDispEventSimpleImpl. Но если хочется сексу, то делай поиск в KB по словам IDispEventImpl bug и правь исходники ATL согласно найденным рекомендациям. Может помочь (а может и нет).
Поменял IDispEventImpl на IDispEventSimpleImpl
Вот теперь как все выглядит:
class COfficeBtnHandler:
public IDispEventSimpleImpl<
/*nID*/ 1, COfficeBtnHandler,
&__uuidof(Office::_CommandBarButtonEvents)>
{
public:
BEGIN_SINK_MAP(COfficeBtnHandler)
SINK_ENTRY_INFO(/*nID =*/1, __uuidof(Office::_CommandBarButtonEvents), /*dispid =*/1, OnClick,&OnClickInfo)
END_SINK_MAP()
D>А в ответ — тишина... Кнопка создается и можно хоть обкликаться — молчание...
По какому интерфейсу цепляешься? m_pButton.GetIID() или __uuidof(Office::_CommandBarButtonEvents)? И чему равен hr после этого DispEventAdvise, т.е. реально подцепился или нет?
Здравствуйте, Dizel, Вы писали:
D>То есть: Кнопка создается. В hr приходит S_OK. Но никакой реакции.
У тебя есть еще шанс поставить точку останова на обработчик IDispEventSimpleImpl::Invoke. Приходит или нет туда. Или свой обработчик написать с выводом сообщения и последующим обращением к исходному.
Потому что об ошибке при обработке события не сообщается.
Здравствуйте, Vi2, Вы писали:
Vi2>По какому интерфейсу цепляешься? m_pButton.GetIID() или __uuidof(Office::_CommandBarButtonEvents)? И чему равен hr после этого DispEventAdvise, т.е. реально подцепился или нет?
Здравствуйте, Dizel, Вы писали:
D>Встречный вопрос — к какому из нтерфейсов надо цепляться?
К тому, который означает событийный интерфейс. В твоем случае, __uuidof(Office::_CommandBarButtonEvents). Что и происходит, если не указать 2-ой параметр в DispEventAdvise.
Здравствуйте, Vi2, Вы писали:
Vi2>К тому, который означает событийный интерфейс. В твоем случае, __uuidof(Office::_CommandBarButtonEvents). Что и происходит, если не указать 2-ой параметр в DispEventAdvise.
Ясно...
То есть подключение происходит (если судить по возвращаемому S_OK)...
А где еще могут быть грабли?