본문 바로가기
IT-개발,DB

[개발/VC] ActiveX 컨트롤에서 자신을 로딩한 웹브라우저 포인터 구하기

by SB리치퍼슨 2011. 9. 27.
[개발/VC] ActiveX 컨트롤에서 자신을 로딩한 웹브라우저 포인터 구하기 

웹브라우저 컨트롤의 포인터를 넘깁니다..


    IWebBrowser2* CActiveXGetIETestCtrl::GetIWebPointer()
    {
        // TODO: Replace the following code with your own drawing code.
        HRESULT hr ;
        IOleContainer *pIContainer = NULL ;
        IWebBrowser2 *pIWeb = NULL ;
        IServiceProvider *pISP = NULL ;
        
        // Get IOleClientSite interface pointer.
        LPOLECLIENTSITE pIClientSite = GetClientSite() ;
        
        // Get IOleContainer interface poineter.
        hr = pIClientSite->GetContainer(&pIContainer) ;
        if (hr != S_OK) {
            pIClientSite->Release() ;
            return NULL ;
        }
        
        // Get IServiceProvider interface pointer.
        hr = pIClientSite->QueryInterface(IID_IServiceProvider,(void **)&pISP) ;
        if (hr != S_OK) {
            pIContainer->Release() ;
            pIClientSite->Release() ;
            return NULL ;
        }

        // Get IWebBrowser2 interface pointer.
        hr = pISP->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&pIWeb) ;
        if (hr != S_OK) {
            pIContainer->Release() ;
            pIClientSite->Release() ;
            pISP->Release() ;
            return NULL ;
        }
        
        // release interface.
        pIContainer->Release() ;
        pIClientSite->Release() ;
        pISP->Release() ;
        return pIWeb ;
    }



    여기서 얻어온 인터페이스 객체를 release 해주지 않았으므로
    ActiveX 컨트롤이 소멸될 때 반드시 해줘야 합니다..

    void CActiveXGetIETestCtrl::OnDestroy() 
    {
        COleControl::OnDestroy();
        
        // TODO: Add your message handler code here
        if (m_pIWeb)
            m_pIWeb->Release() ;
    }



    만약 포인터를 구해오는 멤버함수를 2번 이상 호출한다면
    호출한 횟수만큼 release를 호출해 줘야 합니다..

    제 예제에서는 1번만 호출하고 포인터를 멤버변수로 가지고 있으므로
    종료시 한번만 release 합니다..


    이렇게 얻어온 포인터를 활용해서 다른 URL로 이동,
    웹브라우저를 닫는 함수를 만들어봤습니다..

    IWebBrowser2 에서 지원하는 모든 메소드들은 다 호출할 수 있습니다..
    툴바를 숨긴다던지.. 뭐 맘대로 되겠죠..


    void CActiveXGetIETestCtrl::OnNavigate()
    {
        if (m_pIWeb)
        {
            CString sURL ;
            m_editURL.GetWindowText(sURL) ;
            COleVariant vaURL(sURL) ;
            m_pIWeb->Navigate2(vaURL,NULL,NULL,NULL,NULL) ;
        }
    }

    void CActiveXGetIETestCtrl::OnIEClose() 
    {
        if (m_pIWeb)
        {
            m_pIWeb->Quit() ;
        }
    }
반응형

댓글