본문 바로가기

개발자이야기/VC++

IE 컨트롤

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

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

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

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



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


IWebBrowser2* CActiveXGetIETestCtrl::GetIWebPointer()
{
   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
반응형