2010-03-20 1 views
1

ATL 창에서 웹 브라우저 컨트롤을 호스팅하는 기존 atl 앱이 있습니다. 나는 초기 찾아보기 창을 만들 수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 Embedding -> Shell DocObject View -> Internet Explorer_Server가 있습니다. 팝업 (NewWindow3을 통해 감지)이 발생하면 새 창을 시작하고 새 창에 대해 동일한 코드 시퀀스를 실행합니다. 팝업 창에서 navigate2가 작동하지 않습니다.이 새로운 창을 스파이로 보았을 때 쉘 임베딩 만있었습니다. 시작시 팝업 창을 인스턴스화하더라도 동일한 문제가 발생하므로 NewWindow3과 전혀 관련이 없습니다. 모든 호출이 S_OK를 반환하더라도 웹 컨트롤의 두 번째 인스턴스가 인스턴스화되지 않는 것처럼 보입니다.

이 시퀀스는 IE7에서 정상적으로 작동하지만 현재 IE8을 사용 중이며 팝업 창이 작동하지 않습니다. 분명히 내가 빠진 것이 있지만 그것이 무엇인지 짐작할 수는 없습니다. 어떤 제안이라도 엄청난 도움이 될 것입니다.

+0

호기심과 개척자 - Internet Explorer 인스턴스가 생성되고 있지만 Navigate2 이벤트가 나타나지 않아 문서가 제대로 표시되지 않는 것으로 보입니다. 호기심은 여전히 ​​위의 코드를 함수로 이동하고 첫 번째 창을 만들기 위해 함수를 호출하면 navigate2 호출에도 불구하고 숨겨진 상태로 유지됩니다. 철저히 생각 나게합니다. –

답변

0

내가 주 창을 만들 때 나는

m_spInPlaceObject = m_spWebBrowser; 
_ASSERT(m_spInPlaceObject); 

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

라고하지만 팝업 초기화에서이 호출을 didnt는 것이 밝혀졌습니다. 일단 팝업 초기화에 추가하면 정상적으로 작동합니다.

IE7에서는 작동했지만 IE8에서는 작동하지 않았습니다. 내 부분에 슬랙 코딩. ATL 앱에서 IE 컨트롤을 호스팅하는 것은 여전히 ​​그 어느 때보 다 청초합니다.

관련 문제