Помощь по COM требуется... Ж8(
От: Dizel Россия  
Дата: 05.07.04 11:18
Оценка:
Есть класс:

class COfficeBtnHandler:
public IDispEventImpl<
/*nID*/ 1, COfficeBtnHandler,
&__uuidof(Office::_CommandBarButtonEvents),
&__uuidof(Office::__Office),
/*wMajor*/ OFFICELIB_MAJOR_VERSION,
/*wMinor*/ OFFICELIB_MINOR_VERSION>
{
public:
COfficeBtnHandler(void) {}
virtual ~COfficeBtnHandler(void) {}

// Event Handler
void __stdcall OnClick (
/*[in]*/ struct Office::_CommandBarButton * Ctrl,
/*[in,out]*/ VARIANT_BOOL * CancelDefault );

BEGIN_SINK_MAP(COfficeBtnHandler)
SINK_ENTRY_EX(/*nID =*/ 1, __uuidof(Office::_CommandBarButtonEvents), /*dispid =*/ 1, OnClick)
END_SINK_MAP()

};
void __stdcall COfficeBtnHandler::OnClick(
/*[in]*/ struct Office::_CommandBarButton * Ctrl,
/*[in,out]*/ VARIANT_BOOL * CancelDefault )
{MessageBox(NULL, "Привет из обработчика!!!", "Привет!", 0);}

Создаю кнопку и пытаюсь на нее повесить событие из класса COfficeBtnHandler таким методом:

COfficeBtnHandler* m_Handler;
m_Handler=new COfficeBtnHandler;
//CTestBtnHandler m_Handler;
pApp = pApplication;
myExp=pApp->ActiveExplorer();
CommandBarPtr pCommandBar = myExp->CommandBars->GetItem(_T("my1"));
CommandBarControlPtr m_pButton = NULL;
//MessageBox(NULL,"Connected","Connected",MB_OK);
// Если кнопка уже создана, получаем указатель на нее, иначе создаем новую
m_pButton = pCommandBar->FindControl(msoControlButton,vtMissing,_T("{0BC9C674-86F5-40f8-BC67-526D0AA0B935}"),vtMissing,msoFalse);
if (m_pButton==NULL)
{m_pButton = pCommandBar->Controls->Add(msoControlButton,vtMissing,vtMissing,1,vtMissing);
// Устанавливаем атрибуты
m_pButton->Caption = _T("CaptionText");
m_pButton->TooltipText = _T("TooltipText");
m_pButton->Tag = _T("{0BC9C674-86F5-40f8-BC67-526D0AA0B935}");
MessageBox(NULL,"Button Created","Button Created",MB_OK);
}

m_Handler->AddRef();
HRESULT hr=NULL;
hr=m_Handler->DispEventAdvise(m_pButton,&(m_pButton.GetIID()));

А в ответ — тишина... Кнопка создается и можно хоть обкликаться — молчание...
ХЕЛЬП!!! Или ткните носом в пример если можно.
Re: Помощь по COM требуется... Ж8(
От: algol Россия about:blank
Дата: 05.07.04 11:48
Оценка:
Здравствуйте, 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 согласно найденным рекомендациям. Может помочь (а может и нет).
Re[2]: Помощь по COM требуется... Ж8(
От: Dizel Россия  
Дата: 06.07.04 09:25
Оценка:
Здравствуйте, 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()

public:
COfficeBtnHandler(void) {}
~COfficeBtnHandler(void) {}

// Event Handler
void __stdcall OnClick (/*[in]*/struct Office::_CommandBarButton * Ctrl,/*[in,out]*/VARIANT_BOOL * CancelDefault );
};
//==================================================
void __stdcall COfficeBtnHandler::OnClick (struct Office::_CommandBarButton * Ctrl, VARIANT_BOOL * CancelDefault )
{MessageBox(NULL, "Привет из обработчика!!!", "Привет!", 0);}

И все равно тишина... Ж8(
Так что еще раз хельп...
Re: Помощь по COM требуется... Ж8(
От: Vi2 Удмуртия http://www.adem.ru
Дата: 06.07.04 09:42
Оценка:
Здравствуйте, Dizel, Вы писали:

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) {}

Вот этот virtual не нужен.

D>Создаю кнопку и пытаюсь на нее повесить событие из класса COfficeBtnHandler таким методом:

D>    CommandBarControlPtr m_pButton = NULL;
D>...
D>    hr=m_Handler->DispEventAdvise(m_pButton,&(m_pButton.GetIID()));

D>А в ответ — тишина... Кнопка создается и можно хоть обкликаться — молчание...

По какому интерфейсу цепляешься? m_pButton.GetIID() или __uuidof(Office::_CommandBarButtonEvents)? И чему равен hr после этого DispEventAdvise, т.е. реально подцепился или нет?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Помощь по COM требуется... Ж8(
От: algol Россия about:blank
Дата: 06.07.04 09:59
Оценка:
Здравствуйте, Dizel, Вы писали:

D>И все равно тишина... Ж8(

D>Так что еще раз хельп...

А эта строчка осталась без изменений?
hr=m_Handler->DispEventAdvise(m_pButton,&(m_pButton.GetIID()));

Убери из DispEventAdvise второй параметр.
Re[4]: Помощь по COM требуется... Ж8(
От: Dizel Россия  
Дата: 06.07.04 11:18
Оценка:
Здравствуйте, algol, Вы писали:

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


A>А эта строчка осталась без изменений?

A>
A>hr=m_Handler->DispEventAdvise(m_pButton,&(m_pButton.GetIID()));
A>

A>Убери из DispEventAdvise второй параметр.

Уже...
Такое чувство, что я какую то кнопку неправильную делаю...

То есть:
Кнопка создается.
В hr приходит S_OK.
Но никакой реакции.

Если есть простой пример — киньте, буду копать.
Re[5]: Помощь по COM требуется...
От: Vi2 Удмуртия http://www.adem.ru
Дата: 06.07.04 12:16
Оценка:
Здравствуйте, Dizel, Вы писали:

D>То есть: Кнопка создается. В hr приходит S_OK. Но никакой реакции.


У тебя есть еще шанс поставить точку останова на обработчик IDispEventSimpleImpl::Invoke. Приходит или нет туда. Или свой обработчик написать с выводом сообщения и последующим обращением к исходному.

Потому что об ошибке при обработке события не сообщается.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Помощь по COM требуется... Ж8(
От: Dizel Россия  
Дата: 06.07.04 13:10
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>По какому интерфейсу цепляешься? m_pButton.GetIID() или __uuidof(Office::_CommandBarButtonEvents)? И чему равен hr после этого DispEventAdvise, т.е. реально подцепился или нет?


Сейчас код выглядит так (выдрал из примера):

--------------------------------------
m_pBtnEvt->AddRef();
HRESULT hr=m_pBtnEvt->DispEventAdvise(m_pButton);
--------------------------------------

hr=S_OK
Встречный вопрос — к какому из нтерфейсов надо цепляться?
Re[3]: Помощь по COM требуется...
От: Vi2 Удмуртия http://www.adem.ru
Дата: 06.07.04 13:29
Оценка:
Здравствуйте, Dizel, Вы писали:

D>Встречный вопрос — к какому из нтерфейсов надо цепляться?


К тому, который означает событийный интерфейс. В твоем случае, __uuidof(Office::_CommandBarButtonEvents). Что и происходит, если не указать 2-ой параметр в DispEventAdvise.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Помощь по COM требуется...
От: Dizel Россия  
Дата: 07.07.04 07:12
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>К тому, который означает событийный интерфейс. В твоем случае, __uuidof(Office::_CommandBarButtonEvents). Что и происходит, если не указать 2-ой параметр в DispEventAdvise.


Ясно...
То есть подключение происходит (если судить по возвращаемому S_OK)...
А где еще могут быть грабли?
Re[5]: Помощь по COM требуется...
От: algol Россия about:blank
Дата: 09.07.04 09:28
Оценка:
Здравствуйте, Dizel, Вы писали:

D>Ясно...

D>То есть подключение происходит (если судить по возвращаемому S_OK)...
D>А где еще могут быть грабли?

Тут вот случайно обнаружилось, что IDispEventSimpleImpl в VC++ 6.0 тоже оказывается глючный — Q288724
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.