2010-03-20 109 views
1

我有一個遺留atl應用程序,在ATL窗口中託管webbrowser控件。我創建了一個客戶端實例來使用以下序列來託管瀏覽器:在ATL應用程序中託管WebBrowser控件的問題

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); 

此序列可以很好地創建初始瀏覽窗口。對navigate2的調用工作,如果我通過spy ++查看窗口,我有Shell嵌入 - > Shell DocObject視圖 - > Internet Explorer_Server。當出現彈出窗口(通過NewWindow3檢測到)時,我將啓動一個新窗口併爲新窗口執行相同的代碼序列。在彈出窗口中,navigate2不起作用,當我在spy ++中查看這個新窗口時,我只有Shell嵌入。即使在啓動時實例化彈出窗口,我也會遇到同樣的問題,因此它與NewWindow3根本無關 - 看起來Web控件的第二個實例並未實例化,即使所有調用都返回S_OK。

這個序列在IE7下工作正常,但現在我使用IE8和彈出窗口不工作。顯然我缺少了一些東西,但我不知道它會是什麼。任何建議都會非常有幫助。

+0

古怪的人和古怪的人 - 挖掘它出現的Internet Explorer實例正在創建,但Navigate2事件不會導致它被顯示,根據文檔是什麼應該發生。 古怪的人仍然是,如果我將上面的代碼移動到一個函數並進行函數調用來創建第一個窗口,它仍然保持隱藏,儘管navigate2調用以及。 徹底困惑。 – 2010-03-20 13:17:09

回答

0

原來,當我創建的主窗口我叫

m_spInPlaceObject = m_spWebBrowser; 
_ASSERT(m_spInPlaceObject); 

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

但我沒有在彈出初始化此調用。一旦我將它添加到彈出式初始化,它工作正常。

無論出於何種原因,它在IE7上工作,但不在IE8上。 我的部分編碼冗餘。在ATL應用中託管IE控件仍然像以往一樣整潔!

相關問題