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();
}
'웹, HTML' 카테고리의 다른 글
IHTMLdocumnet2의 이벤트를 후킹하고 싶다면 (0) | 2008.09.10 |
---|---|
웹 규격의 표준 해석 및 강좌들 - 트리오 사이트 (0) | 2008.09.09 |
IWebBrowser2 와 IHTMLDocument2 의 상호변환 (2) | 2008.09.09 |
HTML frame의 웹브라우저 객체에 접근하는 방법 (1) | 2008.09.07 |
자바스크립트 개요 및 강좌 doc (1) | 2008.09.07 |
자바스크립트 사용법, 객체 , 이벤트 등 모든 것 (0) | 2008.09.07 |
HTML 각 공간의 도식... (0) | 2008.09.07 |