주 제

ActiveX 컨트롤에서 자신을 로딩한 웹브라우저 포인터 구하기


--------------------------------------------------------------------------------

올린곳 사내게시판  
올린날 2000-03-10  
출 처 미친병아리 (MS 뉴스그룹, MSDN)






--------------------------------------------------------------------------------

    ActiveX 컨트롤에서 자신을 로딩한 IE 컨트롤의 포인터를 구해올 수 있으면
    웹브라우저의 동작을 제어할 수 있습니다..

    그간 그짓을 하려고 별짓 다해보다 겨우 알아냈습니다..

    서비스 프로바이더라는 인터페이스가 더 있더군요..
    구조파악하는데 여간 복잡한게 아닙니다 그려..

    보면 볼 수록 더 모르겠는게 COM 인터페이스구만요..


    암튼 아래의 멤버함수는 웹브라우저 컨트롤의 포인터를 넘깁니다..


    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() ;
        }
    }




    테스트 환경 : 한글 NT 4.0 Workstation with SP6, IE 5.00.2919.6307,
                 VC++ 6.0 with SP3
    

+ Recent posts