웹, HTML

IWebBrowser2 와 IHTMLDocument2 의 상호변환

디버그정 2008. 9. 9. 16:18
[COM 개체 관련] IWebBrowser2 와 IHTMLDocument2 의 상호변환
조회: 2226
글쓴 사람: Jeong (kevin13@chol.net)
홈페이지: http://www.sysnet.pe.kr
첨부 파일:
언어 선택: 영문
며칠전에 메일로 어떤 분이 IWebBrowser2 에서 IHTMLDocument2 는 구할 수 있겠는데, 그 반대는 어떻게 하는지 모르겠다고 도움을 청하는 메일을 보내오셨습니다.

저도 예전에 상호변환을 해본적이 있다가 마냥 잊고 살았었는데, 그 메일을 계기로 이것저것 "맨땅에 헤딩" 을 해보았습니다. 예전에도 그렇게 해서 얻은 기억이 났거든요. ^.^

여러분은 IHTMLDocument2 에서 IWebBrowser2 를 어떻게 구하시겠습니까? MSDN Library 에도 나와 있지 않던데... 아래의 해답을 보시기 전에... 여러분도 한번 IHTMLDocument2 에서 이것저것 QueryInterface 조작을 해보십시오. ^.^ 재미있으실 겁니다.

어쨌든, 두가지 예제를 다 올려놓겠습니다.

== 1. IWebBrowser2 에서 IHTMLDocument2 인터페이스 구하기 ==

IWebBrowser2 *m_pWebFromUnknown;
IWebBrowser2 *m_pWebFromDoc;

STDMETHODIMP CTestObj::SetSite( IUnknown *pUnkSite )
{
    IOleClientSite *pClientSite;
    HRESULT hr;

    hr = pUnkSite-> QueryInterface( IID_IOleClientSite, 
    (LPVOID *)&pClientSite );
    if ( FAILED( hr ) ) return S_OK;

    IOleContainer *pContainer;
    hr = pClientSite-> GetContainer( &pContainer );
    pClientSite-> Release();
    if ( FAILED( hr ) ) return S_OK;
    
    IServiceProvider *pServiceProvider;
    hr = pContainer-> QueryInterface( IID_IServiceProvider, 
    (LPVOID *)&pServiceProvider );
    pContainer-> Release();
    if ( FAILED( hr ) ) return S_OK;

    hr = pServiceProvider-> QueryService( 
SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID *)
&m_pWebFromUnknown );
    pServiceProvider-> Release();
    if ( FAILED( hr ) ) return S_OK;

    LPDISPATCH pDocDisp;
    hr = m_pWebFromUnknown-> get_Document( &pDocDisp );
    m_pWebFromUnknown-> Release();

    return S_OK;
}

== 2. IHTMLDocument2 에서 IWebBrowser2 인터페이스 구하기 ==

STDMETHODIMP CTestObj::setdoc(LPDISPATCH lpDisp)
{
// IHTMLDocument2 인터페이스 포인터에서 IWebBrowser2 인터페이스 
포인터를 구합니다.

    CComQIPtr<  IHTMLDocument2>  pDoc = lpDisp;

    IOleCommandTarget *pCmdTarget = NULL;
    pDoc-> QueryInterface( IID_IOleCommandTarget, (LPVOID *)
&pCmdTarget );

    if ( pCmdTarget ) {
        IServiceProvider *pSP;
        HRESULT hr = pCmdTarget-> QueryInterface( 
        IID_IServiceProvider, (LPVOID *)&pSP );
        pCmdTarget-> Release();

        if ( SUCCEEDED( hr ) ) {
            hr = pSP-> QueryService( 
            SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID *)&m_pWebFromDoc );

        }
    }

    if ( m_pWebFromDoc == m_pWebFromUnknown ) {
        ::MessageBox( NULL, "똑같습니
            다.", "IWebBrowser2 인터페이스 포인터 비교", MB_OK );
    }

    return S_OK;
}