在项目中,需要从activex中回调javascript所写的函数,之前的做法是:HRESULT hr = S_OK;
IServiceProvider *isp = NULL, *isp2 = NULL;
IOleClientSite* pClientSite = GetClientSite();
IOleContainer* pOleContainer;
if (pClientSite)
{
hr = pClientSite->GetContainer(&pOleContainer);
if (FAILED(hr))
{
hr = S_OK;
TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to query interface of pOleContainer...");
goto CLEANUP;
}
hr = pOleContainer->QueryInterface(IID_IHTMLDocument2,reinterpret_cast <void **> (&m_html_document));
if (FAILED(hr))
{
hr = S_OK;
TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to query interface of m_html_document...");
goto CLEANUP;
}
//hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void**>(&isp));
//if (FAILED(hr))
//{
// hr = S_OK;
// TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to query interface of isp...");
// goto CLEANUP;
//}
//hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void**>(&isp2));
//if (FAILED(hr))
//{
// hr = S_OK;
// TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to query interface of isp2...");
// goto CLEANUP;
//}
获得浏览器
hr = isp->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void**>(&m_browser));
//hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void**>(&m_browser));
//if (FAILED(hr))
//{
// hr = S_OK;
// TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to get interface of m_browser....");
// goto CLEANUP;
//}
//hr = m_browser->get_Document((IDispatch**)&m_html_document);
//if (FAILED(hr))
//{
// hr = S_OK;
// TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to get interface of m_browser....");
// goto CLEANUP;
//}
于是在用m_html_document调用get_Script就总是失败,后来得知这种实现的方法不能在有框架的页面中使用,需要改为调用conterner的方法,见上面源码,这样就可以将activex空间嵌套在字框架中使用了。
IServiceProvider *isp = NULL, *isp2 = NULL;
IOleClientSite* pClientSite = GetClientSite();
IOleContainer* pOleContainer;
if (pClientSite)
{
hr = pClientSite->GetContainer(&pOleContainer);
if (FAILED(hr))
{
hr = S_OK;
TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to query interface of pOleContainer...");
goto CLEANUP;
}
hr = pOleContainer->QueryInterface(IID_IHTMLDocument2,reinterpret_cast <void **> (&m_html_document));
if (FAILED(hr))
{
hr = S_OK;
TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to query interface of m_html_document...");
goto CLEANUP;
}
//hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void**>(&isp));
//if (FAILED(hr))
//{
// hr = S_OK;
// TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to query interface of isp...");
// goto CLEANUP;
//}
//hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void**>(&isp2));
//if (FAILED(hr))
//{
// hr = S_OK;
// TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to query interface of isp2...");
// goto CLEANUP;
//}
获得浏览器
hr = isp->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void**>(&m_browser));
//hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void**>(&m_browser));
//if (FAILED(hr))
//{
// hr = S_OK;
// TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to get interface of m_browser....");
// goto CLEANUP;
//}
//hr = m_browser->get_Document((IDispatch**)&m_html_document);
//if (FAILED(hr))
//{
// hr = S_OK;
// TR_LOGDBG("CMSPAudioCtrl::OnSetClientSite | Failed to get interface of m_browser....");
// goto CLEANUP;
//}
于是在用m_html_document调用get_Script就总是失败,后来得知这种实现的方法不能在有框架的页面中使用,需要改为调用conterner的方法,见上面源码,这样就可以将activex空间嵌套在字框架中使用了。