C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[26364] [질문] ActiveX에서 IE 제어하는 방법을 알려 주세요 !!
김태선 [jsdkts] 1867 읽음    2003-07-18 15:43
ActiveX를 로딩한 IE를 제어할려면 IE의 컨트롤 포인트를 구해와야 합니다.

미친병아리(madchick)님이 브이씨의 경우는 참고자료를 홈페이지에 달아놨는데

빌더씨의 경우는 자료를 찾을 수 없습니다.

아시는 고수님은 답변을 부탁드립니다.

^^;

아래는 브이씨의 경우 자료입니다.

ActiveX 컨트롤에서 자신을 로딩한 웹브라우저 포인터 구하기
   
올린곳 : 사내게시판
올린날 : 2000-03-10
출  처 : 미친병아리 (MS 뉴스그룹, MSDN)

수정일 :

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

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


+ -

관련 글 리스트
26364 [질문] ActiveX에서 IE 제어하는 방법을 알려 주세요 !! 김태선 1867 2003/07/18
32863     Re:[질문] ActiveX에서 IE 제어하는 방법을 알려 주세요 !! 김상구.패패루 892 2003/07/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.