1. IWebBrowser2 에서 IHTMLDocument2 인터페이스 구하기
IWebBrowser2 *m_pWebFromUnknown;
IWebBrowser2 *m_pWebFromDoc;
STDMETHODIMP CTestObj::SetSite( IUnknown *pUnkSite )
{
IOleClientSite *pClientSite;
HRESULT hr;
hr = pUnkSite-> QueryInterface( IID_IOleClientSite,
(LPVOID *)&pClientSite );
if ( FAILED( hr ) ) return S_OK;
IOleContainer *pContainer;
hr = pClientSite-> GetContainer( &pContainer );
pClientSite-> Release();
if ( FAILED( hr ) ) return S_OK;
IServiceProvider *pServiceProvider;
hr = pContainer-> QueryInterface( IID_IServiceProvider,
(LPVOID *)&pServiceProvider );
pContainer-> Release();
if ( FAILED( hr ) ) return S_OK;
hr = pServiceProvider-> QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID *)
&m_pWebFromUnknown );
pServiceProvider-> Release();
if ( FAILED( hr ) ) return S_OK;
LPDISPATCH pDocDisp;
hr = m_pWebFromUnknown-> get_Document( &pDocDisp );
m_pWebFromUnknown-> Release();
return S_OK;
}
IWebBrowser2 *m_pWebFromUnknown;
IWebBrowser2 *m_pWebFromDoc;
STDMETHODIMP CTestObj::SetSite( IUnknown *pUnkSite )
{
IOleClientSite *pClientSite;
HRESULT hr;
hr = pUnkSite-> QueryInterface( IID_IOleClientSite,
(LPVOID *)&pClientSite );
if ( FAILED( hr ) ) return S_OK;
IOleContainer *pContainer;
hr = pClientSite-> GetContainer( &pContainer );
pClientSite-> Release();
if ( FAILED( hr ) ) return S_OK;
IServiceProvider *pServiceProvider;
hr = pContainer-> QueryInterface( IID_IServiceProvider,
(LPVOID *)&pServiceProvider );
pContainer-> Release();
if ( FAILED( hr ) ) return S_OK;
hr = pServiceProvider-> QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID *)
&m_pWebFromUnknown );
pServiceProvider-> Release();
if ( FAILED( hr ) ) return S_OK;
LPDISPATCH pDocDisp;
hr = m_pWebFromUnknown-> get_Document( &pDocDisp );
m_pWebFromUnknown-> Release();
return S_OK;
}
IWebBrowser2 *m_pWebFromUnknown; IWebBrowser2 *m_pWebFromDoc; STDMETHODIMP CTestObj::SetSite( IUnknown *pUnkSite ) { IOleClientSite *pClientSite; HRESULT hr; hr = pUnkSite-> QueryInterface( IID_IOleClientSite, (LPVOID *)&pClientSite ); if ( FAILED( hr ) ) return S_OK; IOleContainer *pContainer; hr = pClientSite-> GetContainer( &pContainer ); pClientSite-> Release(); if ( FAILED( hr ) ) return S_OK; IServiceProvider *pServiceProvider; hr = pContainer-> QueryInterface( IID_IServiceProvider, (LPVOID *)&pServiceProvider ); pContainer-> Release(); if ( FAILED( hr ) ) return S_OK; hr = pServiceProvider-> QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID *) &m_pWebFromUnknown ); pServiceProvider-> Release(); if ( FAILED( hr ) ) return S_OK; LPDISPATCH pDocDisp; hr = m_pWebFromUnknown-> get_Document( &pDocDisp ); m_pWebFromUnknown-> Release(); return S_OK; }
2. IHTMLDocument2 에서 IWebBrowser2 인터페이스 구하기
STDMETHODIMP CTestObj::setdoc(LPDISPATCH lpDisp)
{
/* IHTMLDocument2 인터페이스 포인터에서 IWebBrowser2 인터페이스 포인터를 구합니다. */
CComQIPtr< IHTMLDocument2> pDoc = lpDisp;
IOleCommandTarget *pCmdTarget = NULL;
pDoc-> QueryInterface( IID_IOleCommandTarget, (LPVOID *)&pCmdTarget );
if ( pCmdTarget ) {
IServiceProvider *pSP;
HRESULT hr = pCmdTarget-> QueryInterface(
IID_IServiceProvider, (LPVOID *)&pSP );
pCmdTarget-> Release();
if ( SUCCEEDED( hr ) ) {
hr = pSP-> QueryService(
SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID *)&m_pWebFromDoc );
}
}
if ( m_pWebFromDoc == m_pWebFromUnknown ) {
::MessageBox( NULL, "똑같습니다.", "IWebBrowser2 인터페이스 포인터 비교", MB_OK );
}
return S_OK;
}
STDMETHODIMP CTestObj::setdoc(LPDISPATCH lpDisp)
{
/* IHTMLDocument2 인터페이스 포인터에서 IWebBrowser2 인터페이스 포인터를 구합니다. */
CComQIPtr< IHTMLDocument2> pDoc = lpDisp;
IOleCommandTarget *pCmdTarget = NULL;
pDoc-> QueryInterface( IID_IOleCommandTarget, (LPVOID *)&pCmdTarget );
if ( pCmdTarget ) {
IServiceProvider *pSP;
HRESULT hr = pCmdTarget-> QueryInterface(
IID_IServiceProvider, (LPVOID *)&pSP );
pCmdTarget-> Release();
if ( SUCCEEDED( hr ) ) {
hr = pSP-> QueryService(
SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID *)&m_pWebFromDoc );
}
}
if ( m_pWebFromDoc == m_pWebFromUnknown ) {
::MessageBox( NULL, "똑같습니다.", "IWebBrowser2 인터페이스 포인터 비교", MB_OK );
}
return S_OK;
}
STDMETHODIMP CTestObj::setdoc(LPDISPATCH lpDisp) { /* IHTMLDocument2 인터페이스 포인터에서 IWebBrowser2 인터페이스 포인터를 구합니다. */ CComQIPtr< IHTMLDocument2> pDoc = lpDisp; IOleCommandTarget *pCmdTarget = NULL; pDoc-> QueryInterface( IID_IOleCommandTarget, (LPVOID *)&pCmdTarget ); if ( pCmdTarget ) { IServiceProvider *pSP; HRESULT hr = pCmdTarget-> QueryInterface( IID_IServiceProvider, (LPVOID *)&pSP ); pCmdTarget-> Release(); if ( SUCCEEDED( hr ) ) { hr = pSP-> QueryService( SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID *)&m_pWebFromDoc ); } } if ( m_pWebFromDoc == m_pWebFromUnknown ) { ::MessageBox( NULL, "똑같습니다.", "IWebBrowser2 인터페이스 포인터 비교", MB_OK ); } return S_OK; }