Как избежать вывода консоли о неподдерживаемых операциях?(IWebBrowser2, DISP_E_MEMBERNOTFOUND) - PullRequest
2 голосов
/ 17 мая 2011

КОНТЕКСТ: Я пытаюсь использовать IWebBrowser2, чтобы создать небольшой встроенный браузер для просмотра локальных файлов HTML. Я делаю это с помощью MFC и CWnd :: CreateControl в частности. Все работает хорошо, за исключением одного момента: когда я нажимаю на ссылки html, я получаю сообщения (для консоли отладки Visual C ++) о COleException. Браузер хорошо открывает ссылки, и других видимых эффектов нет, кроме сообщений в консоли.
Я смог отследить место метания. Есть callstack: <pre> 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 генерирует исключение (и перехватывает его само) и загрязняет выходные данные отладки.
ВОПРОС: Что я могу сделать, чтобы избежать или подавить эти сообщения?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Это сообщение об ошибке: <pre> 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.

1 Ответ

4 голосов
/ 18 мая 2011

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

Решение:

  • Игнорировать выходные данные отладки или
  • Получите класс из COleControlSite для переопределения GetStyle, скопируйте реализацию COleControlSite :: GetStyle, за исключением тех строк, которые читают стиль из ActiveX. Затем переопределяет CreateControlSite в классе родительского окна веб-браузера и использует новый контрольный сайт. Для VC6 или более ранней версии CWnd :: CreateControlSite не существует, и требуется переопределение контейнера управления .
...