Проблема размещения элемента управления WebBrowser в приложении ATL - PullRequest
1 голос
/ 20 марта 2010

У меня есть устаревшее приложение 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);

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

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

1 Ответ

0 голосов
/ 22 марта 2010

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

m_spInPlaceObject = m_spWebBrowser;
_ASSERT(m_spInPlaceObject);

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

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

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

...