Re: Как создать таймер (ITimer) из BHO.
От: AndrewJD США  
Дата: 22.01.07 15:12
Оценка: 3 (1)
Здравствуйте, vicent, Вы писали:

V>HRESULT hr = isp->QueryService(SID_STimerService, &timerServ);

V>Возвращается ошибка, timerServ = 0.
V>Собственно вопрос — как правильно создать таймер?

Запрашивай у документа, а не у WebBrowser2


V>/////////////////////////////////////////////////////////////////////////////

V>// SetSite — Initializes the BHO
V>//
V>HRESULT CViewSource::SetSite(IUnknown *pUnkSite)
V>Пытался прямо здесь создать таймер, темже кодом — с таким же результатом. В качестве аргумента для ServiceProvider-а подсовывал только pUnkSite.

Здесь слишком рано
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[5]: Как создать таймер (ITimer) из BHO.
От: Left2 Украина  
Дата: 23.01.07 09:05
Оценка: 3 (1)
V>Вот просто и заинтересовало — где еще можно узнать о том что есть у IWebBrowser, а что у IHTMLDocument и других?..

Методом экспериментов — вот код
Автор: Left2
Дата: 21.08.06
который тебе поможет посмотреть какие сервисы выставляет COM-обьект.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Как создать таймер (ITimer) из BHO.
От: AndrewJD США  
Дата: 23.01.07 08:10
Оценка: 2 (1)
Здравствуйте, vicent, Вы писали:

V>Там как раз и пишется про то, что берем ServiceProvider (правда — как раз источиком был — IHTMLDocument2) и получаем все доступные интерфейсы.

Это как раз логично. Поскольку документ является OLE контейнером для других документов и ActiveX контролов. Единственное место где ActiveX контрол может спросить про сервисы — это его контейнер.


V>Вот просто и заинтересовало — где еще можно узнать о том что есть у IWebBrowser, а что у IHTMLDocument и других?..

Как вариант, покопать исходники винды
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[3]: Как создать таймер (ITimer) из BHO.
От: AndrewJD США  
Дата: 22.01.07 16:05
Оценка: :)
Здравствуйте, vicent, Вы писали:

V>Никогда бы не подумал.

V>А в чем разница — вроде я считал, что ServiceProvider одинаковый у IWebBrowser2 и у IHTMLDocument2?

У IWebBrowser2 одни сервисы, а у IHTMLDocument2 другие
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Как создать таймер (ITimer) из BHO.
От: vicent  
Дата: 22.01.07 14:55
Оценка:
Есть BHO.
Потребовалось создать таймер через Timer API. Не могу правильно создать объект ITimerService.
Написал код, вызываю из обработчика DocumentComplete:

void CV::startTimer()
{
CComPtr<ITimerService> timerServ;
CComQIPtr<IServiceProvider> isp(m_spWebBrowser2);
HRESULT hr = isp->QueryService(SID_STimerService, &timerServ);

CComPtr<ITimer> itimer;
hr = timerServ->CreateTimer(NULL, &itimer);
}

в строке
HRESULT hr = isp->QueryService(SID_STimerService, &timerServ);
Возвращается ошибка, timerServ = 0.
Собственно вопрос — как правильно создать таймер?



переменная m_spWebBrowser2 объявлена:

CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> m_spWebBrowser2;

ее иницилизация идет в стартовой функции.
/////////////////////////////////////////////////////////////////////////////
// SetSite — Initializes the BHO
//
HRESULT CViewSource::SetSite(IUnknown *pUnkSite)
{
// Retrieve and store the IWebBrowser2 pointer
m_spWebBrowser2 = pUnkSite;
if (m_spWebBrowser2 == NULL)
return E_INVALIDARG;

// Retrieve and store the IConnectionPointerContainer pointer
m_spCPC = m_spWebBrowser2;
if (m_spCPC == NULL)
return E_POINTER;

// Connect to the container for receiving event notifications
return Connect();
}

Пытался прямо здесь создать таймер, темже кодом — с таким же результатом. В качестве аргумента для ServiceProvider-а подсовывал только pUnkSite.
Re[2]: Как создать таймер (ITimer) из BHO.
От: vicent  
Дата: 22.01.07 15:35
Оценка:
Здравствуйте, AndrewJD, Вы писали:

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


V>>HRESULT hr = isp->QueryService(SID_STimerService, &timerServ);

V>>Возвращается ошибка, timerServ = 0.
V>>Собственно вопрос — как правильно создать таймер?

AJD>Запрашивай у документа, а не у WebBrowser2



V>>/////////////////////////////////////////////////////////////////////////////

V>>// SetSite — Initializes the BHO
V>>//
V>>HRESULT CViewSource::SetSite(IUnknown *pUnkSite)
V>>Пытался прямо здесь создать таймер, темже кодом — с таким же результатом. В качестве аргумента для ServiceProvider-а подсовывал только pUnkSite.

AJD>Здесь слишком рано



Спасибо, заработало — запросил у браузера документ (IHTMLDocument2) и у него взял ServiceProvider.
Никогда бы не подумал.
А в чем разница — вроде я считал, что ServiceProvider одинаковый у IWebBrowser2 и у IHTMLDocument2?
Re[4]: Как создать таймер (ITimer) из BHO.
От: vicent  
Дата: 22.01.07 16:49
Оценка:
Здравствуйте, AndrewJD, Вы писали:

V>>Никогда бы не подумал.

V>>А в чем разница — вроде я считал, что ServiceProvider одинаковый у IWebBrowser2 и у IHTMLDocument2?

AJD>У IWebBrowser2 одни сервисы, а у IHTMLDocument2 другие


Просто когда смотрел документацию — там нигде нет упоминания, откуда можно взять ServiceProvider.
В доке по IHTMLDocument,2,3,4,5 — тоже не сказано что он как-то связан с ITimer
Раньше я читал статью из MSDN "Browser Detection Revisited, Fixing CPopupText, COM and the IService Provider Interface".
Там как раз и пишется про то, что берем ServiceProvider (правда — как раз источиком был — IHTMLDocument2) и получаем все доступные интерфейсы.

Вот просто и заинтересовало — где еще можно узнать о том что есть у IWebBrowser, а что у IHTMLDocument и других?..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.