웹, HTML

WebBrowser 콘트롤에서 프레임을 구하는 소스

디버그정 2008. 9. 7. 13:45

WebBrowser 콘트롤에서 프레임을 구하는 소스

아래의 소스는 "Programming Microsoft Internet Explorer 5" 라는 책의 6장에 나와있는 조각소스입니다. 그 책의 예제 CD 에는 아래의 소스가 나와 있지 않은데요. 아래의 부분에 대해서 "질문과 답변" 란에 글이 올라왔는 데, 매번 답변해 주기 위해서 그 소스를 직접 타이핑 하기도 그래서 아예 이곳에 영구보관을 해둡니다. ( 질문답변란은 주기적으로 삭제를 합니다. )

아래의 m_webBrowser 변수는, 여러분들이 VC++ 에서 "웹브라우저 콘트롤" 을 삽입한 경우, 그 콘트롤을 가리키는 변수명입니다.
HtmlView 를 사용하는 경우에는 그냥 HtmlView 클래스의 함수안에서 GetDocument() 를 통해서 lpDisp 에 대입하시면 됩니다.

최상단의 웹브라우저 콘트롤에서, 그 웹브라우저 콘트롤이 소유하고 있는 "자식 웹브라우저 콘트롤", 즉 Frame 을 열람해오는 소스입니다.

물론, 프레임안의 HTML 페이지가 또 프레임으로 나뉘어져 있는 경우를 위해서 아래의 구해 오는 부분을 그에 따른 "재귀호출" 로 구성해야 합니다. 하지만, 실무에서는 거의 3단계 이상의 프레임 사용이 없기 때문에 아예 그렇게 3번까지만 구해오는 방식을 취하는 분들도 계십니다.


LPDISPATCH lpDisp = NULL;
lpDisp = m_webBrowser.GetDocument();

if ( lpDisp ) {
IOleContainer *pContainer;

HRESULT hr = lpDisp->QueryInterface( IID_IOleContainer, (void **)&pContainer );
lpDisp->Release();

if ( FAILED( hr ) ) return hr;

IEnumUnknown *pEnumerator;

hr = pContainer->EnumObjects( OLECONTF_EMBEDDINGS, &pEnumerator );
pContainer->Release();

if ( FAILED( hr ) ) return hr;

IUnknown *pUnk;
ULONG uFetched;

for ( UINT i = 0; S_OK == pEnumerator->Next( 1, &pUnk, &uFetched; i ++ ) {
IWebBrowser2 *pWebBrowser;
hr = pUnk->QueryInterface( IID_IWebBrowser2, (void **)&pWebBrowser );
pUnk->Release();

if ( SUCCEEDED( hr ) ) {
// 구해진 내부 프레임을 소유한 IWebBrowser2 인터페이스를 사용한 후, Release 합니다.

pWebBrowser->Release();
}
}

pEnumerator->Release();
}