Как избежать вывода на консоль информации о неподдерживаемых операциях? (IWebBrowser2, DISP_E_MEMBERNOTFOUND)

КОНТЕКСТ: я пытаюсь использовать IWebBrowser2 для создания небольшого встроенного браузера для просмотра локальных html-файлов. Я делаю это с помощью MFC и CWnd::CreateControl в частности. Все работает хорошо, за исключением одного момента: когда я нажимаю на html-ссылки, я получаю сообщения (в консоль отладки Visual C++) о COleException. Браузер хорошо открывает ссылки, и никаких других наблюдаемых эффектов, кроме сообщений в консоли, не наблюдается
Мне удалось отследить место заброса. Существует стек вызовов:

AfxThrowOleException(...)
COleDispatchDriver::InvokeHelperV(...)
COleControlSite::InvokeHelperV(...)
COleControlSite::InvokeHelper(...)
COleControlSite::GetProperty(...)
COleControlSite::GetStyle(...) 
CWnd::GetStyle(...)
CWnd::OnDisplayChange(...)
CWnd::OnSettingChange(...)
CWnd::OnWndMsg(...)
CWnd::WindowProc(...)
AfxCallWndProc(...)
CWnd::SendMessageToDescendants(...)CWnd::SendMessageToDescendants(...)
CWnd::OnDisplayChange(...)
CWnd::OnSettingChange(...)
CDialog::OnSettingChange(...)
CWnd::OnWndMsg(...)
CWnd::WindowProc(...)
AfxCallWndProc(...)
AfxWndProc(...)
После некоторого расследования я знаю, что MFC пытается вызвать «Invoke» для IDispatch IWebBrowser, чтобы получить состояние «ENABLED» управления веб-браузером. В свою очередь управление через возвращаемое значение сообщает, что такой запрос не может быть удовлетворен. MFC создает исключение (и перехватывает его самостоятельно) и загрязняет вывод отладки.
ВОПРОС: Что я могу сделать, чтобы избежать или подавить эти сообщения?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Это сообщение об ошибке:

Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003).
RaiseException: Thread=9f84aba4 Proc=8c24c980 'HtmlHelpBrowser.exe'
AKY=00000401 PC=03fb542c(coredll.dll+0x0004542c) RA=8000a700(NK.EXE+0x00009700) BVA=00000001 FSR=00000001

Я делаю все это на Windows CE 5.0 с Visual C++ 9.0.


person cybevnm    schedule 17.05.2011    source источник


Ответы (1)


Причина: COleControlSite::GetStyle() проверьте DISPID_ENABLED и DISPID_BORDERSTYLE, два идентификатора отправки, которые IE не реализовал. Вызов GetStyle находится прямо в стеке вызовов.

решение:

  • Игнорировать вывод отладки или
  • Создайте класс, производный от COleControlSite, для переопределения GetStyle, скопируйте реализацию COleControlSite::GetStyle, за исключением тех строк, которые считывают стиль из ActiveX. Затем переопределите CreateControlSite в родительском веб-браузере. класс окна и использовать новый сайт управления. Для VC6 или более ранней версии CWnd::CreateControlSite не существует, и требуется переопределение контейнера управления.
person Sheng Jiang 蒋晟    schedule 17.05.2011
comment
Привет! Большое спасибо за ответ, второе решение очень хорошо решило мою проблему. У него есть один небольшой недостаток: все хосты моего элемента управления на основе IWebBrowser2 (диалоговые окна и т. д.) должны реализовывать метод CreateControlSite. Существуют ли какие-либо варианты для инкапсуляции CreateControlSite в моем элементе управления на основе IWebBrowser2? - person cybevnm; 18.05.2011
comment
Вы можете получить класс от CDialog и добавить туда реализацию CreateControlSite, а затем использовать класс в качестве базового класса ваших диалогов. - person Sheng Jiang 蒋晟; 18.05.2011
comment
Будем считать это одним из способов. Спасибо за помощь. - person cybevnm; 18.05.2011