Проблема размещения элемента управления WebBrowser в приложении ATL

У меня есть устаревшее приложение atl, в котором размещается элемент управления веб-браузером в окне ATL. Я создаю экземпляр клиента для размещения браузера, используя следующую последовательность

CComPtr<IOleObject> spOleObject;
HRESULT hr = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC, ID_IOleObject,(void**)&spOleObject);

spOleObject->SetClientSite(this);
GetClientRect(&rcClient);
hr = spOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, &msg, this, 0, m_hWnd, &rcClient);

hr = AtlAdvise(m_spWebBrowser, GetUnknown(), DIID_DWebBrowserEvents2, &m_dwCookie);

CComVariant navvar(navurl);
m_spWebBrowser->Navigate2(&navvar, NULL, NULL, NULL, NULL);

Эта последовательность отлично работает для создания начального окна просмотра. Вызов navigation2 работает, и если я смотрю на окно через spy++, у меня есть Shell Embedding -> Shell DocObject View -> Internet Explorer_Server. Когда появляется всплывающее окно (обнаруженное через NewWindow3), я запускаю новое окно и выполняю ту же последовательность кода для нового окна. Во всплывающем окне navigation2 не работает, и когда я смотрю на это новое окно в spy++, у меня просто есть встраивание оболочки. У меня возникает та же проблема, даже если я создаю экземпляр всплывающего окна при запуске, поэтому он вообще не связан с NewWindow3 - кажется, что второй экземпляр веб-элемента управления не создает экземпляр, хотя все вызовы возвращают S_OK.

Эта последовательность отлично работала в IE7, но теперь я использую IE8, и всплывающее окно не работает. Мне явно чего-то не хватает, но я не могу догадаться, что это может быть. Любые предложения будут невероятно полезны.


person Andrew Bucknell    schedule 20.03.2010    source источник
comment
Curioser и curioser - при копании выясняется, что экземпляр Internet Explorer создается, но событие Navigate2 не вызывает его отображение, что, согласно документации, должно произойти. Еще любопытнее то, что если я перемещу приведенный выше код в функцию и сделаю вызов функции для создания первого окна, он останется скрытым, несмотря на вызов navigation2. Тщательно сбит с толку.   -  person Andrew Bucknell    schedule 20.03.2010


Ответы (1)


Оказывается, когда я создал главное окно, я назвал

m_spInPlaceObject = m_spWebBrowser;
_ASSERT(m_spInPlaceObject);

if (m_spInPlaceObject)
    m_spInPlaceObject->SetObjectRects(&rcClient, &rcClient);

Но у меня не было этого вызова при инициализации всплывающего окна. Как только я добавил это в инициализацию всплывающего окна, все заработало нормально.

По какой-то причине он работал в IE7, но не в IE8. Слабое кодирование с моей стороны. Размещение элемента управления IE в приложении ATL по-прежнему удобно, как никогда!

person Community    schedule 22.03.2010