반응형
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
웹브라우저의 동작을 제어할 수 있습니다..
그간 그짓을 하려고 별짓 다해보다 겨우 알아냈습니다..
서비스 프로바이더라는 인터페이스가 더 있더군요..
구조파악하는데 여간 복잡한게 아닙니다 그려..
보면 볼 수록 더 모르겠는게 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
반응형
'개발자이야기 > VC++' 카테고리의 다른 글
vc++ 윈도우 구분 소스 (0) | 2011.02.24 |
---|---|
ShellExecute 함수의 여러가지 사용법에 대하여... (0) | 2011.02.23 |
base64 암복호화 c/c++ (0) | 2010.11.30 |
Visual Studio 2005에서 브라우저 도우미 개체 만들기(Windows IETechCol) (0) | 2010.10.13 |
[강좌] 인터넷 익스플로러에서 팝업창을 차단하는 BHO 모듈 개발하기 (0) | 2010.10.13 |