关于几个HTML文档接口的使用探讨
2008-09-30 11:35
316 查看
关于几个HTML文档接口的使用探讨收藏
请高手注释一下关于判断IE版本的代码
![](http://img.baidu.com/img/iknow/icn_point.gif)
悬赏分:100 - 解决时间:2008-9-21 12:12
这是ATL
工程中一段判断IE浏览器的程序,我是个初学者,对接口不太熟。我知道要用navigator.appVersion判断客户端浏览器类型和版本,可是为
了找navigator还必须从IServiceProvider找到IWebBrowser2,在找到Document指针的IDispatch接口,
再去获取IOmNavigator,才能得到navigator吗?
自己试着注释了一下,看看由神问题吗?
STDMETHODIMP Cwebcheck::SetSite(IUnknown *pUnkSite)//判断IE版本
{
if(!pUnkSite)
{
ATLTRACE(_T("SetSite(): pUnkSite is NULL/n"));
}
else
{
HRESULT hRes = S_OK;
//查询IOleClientSite来取得IServiceProvider
CComPtr <IServiceProvider> spSP;
hRes = pUnkSite->QueryInterface(&spSP);
if(SUCCEEDED(hRes) && spSP) // 如果成功获取接口指针
hRes = spSP->QueryService(IID_IWebBrowserApp, &m_pWebBrowser2);
}
m_spUnkSite = pUnkSite;// 检索并存储 IWebBrowser2 指针
m_bIsIe7 = FALSE;
if(pUnkSite)
{
CComPtr <IDispatch> pDocDisp;
CComQIPtr <IHTMLDocument2> pHtmlDoc2;
CComQIPtr <IHTMLWindow2> pWindow。
CComQIPtr <IOmNavigator> pNavigator
HRESULT hRes = m_pWebBrowser2->get_Document(&pDocDisp);//判断执行结果是否成功获取Document指针(当前的文档对象的指针)
if(SUCCEEDED(hRes) && pDocDisp)//如果成功
{
hRes = pDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc2);//判断是否成功获取IHTMLDocument2指针
if(SUCCEEDED(hRes) && pHtmlDoc2)//如果成功
{
hRes = pHtmlDoc2->get_parentWindow(&pWindow);//判断是否成功获得IHTMLWindow2 指针
if(SUCCEEDED(hRes) && pWindow)//如果成功
{
hRes = pWindow->get_navigator(&pNavigator);//判断是否成功获取IOmNavigator指针
if(SUCCEEDED(hRes) && pNavigator)//如果成功
{
。。。。。。。。。 }
}
}
}
}
}
return S_OK;
} http://zhidao.baidu.com/question/66833273.html
新一篇: Hook学习笔记 | 旧一篇: (转贴)亲历世纪大海啸的旅程
function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}关于几个HTML文档接口的使用探讨 |
赵湘宁 |
问题: |
在使用Active Accessibility SDK的过程中,我从某个窗口的句柄来获得IHTMLDocument2指针。有没有什么方法可以从IHTMLDocument2指针来获得 IWebBrowser2指针?我用QueryInterface在两个接口(IHTMLDocument2 和 IWebBrowser2)上试过,但没有成功。我也用网景(Netscape)的 HTMLWindow2 指针试过从get_navigator获取IOmNavigator *。也以失败告终。请高手指点。 |
解答: |
这个问题通常是COM编程中存在的共性问题。你有了窗口,文档,或者浏览器,你明明知道可以通过这些已知数据来得到其它的信息,但往往在实际环境中一运 行,QueryInterface总是给你送回一个肥大的NULL。这个问题的答案实际上隐藏在神秘的IServiceProvider接口中,顾名思 义,IServiceProvider的作用就是提供服务。IServiceProvider是个非常棒的接口:它只有一个方法—— QueryService。如果你会用ATL智能指针,就像下面这样。首先必须获得IServiceProvider接口, |
CComQIPtr<IServiceProvider> isp = pIHTMLDocument2; |
这行代码实际上就是对文档执行了一次 QueryInterface,以询问IServiceProvider接口。一旦具备了isp,你便可以象下面这样获得浏览器。 |
CComQIPtr<IWebBrowser2> iwb2; isp->QueryService(IID_IWebBrowserApp,IID_IWebBrowser2, (void**)&iwb2); |
如果你还是不明白上面所讲东西,没有关系,很正常。COM编程的一个根本规则是:QueryInterface必须总是要返回所查询对象的接口。但是文档 不实现 IWebBrowser2 接口,它只知道如何获得正在工作的对象。文档,浏览器和窗口都是独立的对象。通常IServiceProvider被用于多个单独且相关的COM对象群来 实现某种类型的服务。QueryInterface询问某个对象:“你实现这个接口吗?”,而QueryService告诉某个服务提供者,“不管什么对 象实现这个接口都要告诉我。” 使用QueryService返回的接口指针与所查询的对象可能相同,也可能不相同。如图一所示。所有对象都实现它们自己不同的接口并在内部存储指向另一 个对象的指针。你必须用IServiceProvider接口来获得特定接口的对象,不论它是哪一个对象实现的。IServiceProvider:: QueryService要追随这些内部指针来获取实现你所想要的接口对象。 |
![]() |
图一 多个对象,一个IServiceProvider |
从本质上讲,IServiceProvider用于导航DHTML对象层次。假设你正在写一个ActiveX控件来导航这个对象模型。你如何做呢?首先要像下面这样查询IOleClientSite来取得IServiceProvider: |
CComQIPtr<IServiceProvider> isp = pSite; |
然后,一旦你具备了IServiceProvider,则可以用QueryService来从中查询应用对象。 |
CComQIPtr<IWebBrowserApp> iwba; isp->QueryService(IID_IWebBrowserApp, IID_IWebBrowserApp, (void **)&iwba); |
接下来你就可以导航这个对象层次了(应用对象在最顶层)。如果你想要得到Web浏览器,那么与前面类似。 |
CComQIPtr<IWebBrowser2> iwb2; isp->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void **)&iwb2)); |
在所有这些例子中,SID_SWebBrowserApp都是服务标示,但你也能常常见到将IID_IWebBrowserApp作为服务ID的代码。两种用法都可以行得通,因为<shlguid.h>文件中有个宏定义: |
#defines SID_SWebBrowserApp IID_IWebBrowserApp |
但从编程的角度上讲,SID_SWebBrowserApp在技术上更正确,并且对阅读代码的人来说也更清晰。 |
此外,如果你有足够的勇气去实现像DHTML对象模型这类庞大的对象系统的话,你也要用到IServiceProvider接口...... |
关于这个问题的解答我也只能浅尝辄止地说明到这个地步,再往深处走,我也蒙嚓嚓。更深层次的探讨请各位参见MSDN库。 |
由于个人水平所限,对解答中存在的错误与不详之处,请各位弟兄海涵。 |
![](http://img.baidu.com/img/iknow/icn_point.gif)
悬赏分:100 - 解决时间:2008-9-21 12:12
这是ATL
工程中一段判断IE浏览器的程序,我是个初学者,对接口不太熟。我知道要用navigator.appVersion判断客户端浏览器类型和版本,可是为
了找navigator还必须从IServiceProvider找到IWebBrowser2,在找到Document指针的IDispatch接口,
再去获取IOmNavigator,才能得到navigator吗?
自己试着注释了一下,看看由神问题吗?
STDMETHODIMP Cwebcheck::SetSite(IUnknown *pUnkSite)//判断IE版本
{
if(!pUnkSite)
{
ATLTRACE(_T("SetSite(): pUnkSite is NULL/n"));
}
else
{
HRESULT hRes = S_OK;
//查询IOleClientSite来取得IServiceProvider
CComPtr <IServiceProvider> spSP;
hRes = pUnkSite->QueryInterface(&spSP);
if(SUCCEEDED(hRes) && spSP) // 如果成功获取接口指针
hRes = spSP->QueryService(IID_IWebBrowserApp, &m_pWebBrowser2);
}
m_spUnkSite = pUnkSite;// 检索并存储 IWebBrowser2 指针
m_bIsIe7 = FALSE;
if(pUnkSite)
{
CComPtr <IDispatch> pDocDisp;
CComQIPtr <IHTMLDocument2> pHtmlDoc2;
CComQIPtr <IHTMLWindow2> pWindow。
CComQIPtr <IOmNavigator> pNavigator
HRESULT hRes = m_pWebBrowser2->get_Document(&pDocDisp);//判断执行结果是否成功获取Document指针(当前的文档对象的指针)
if(SUCCEEDED(hRes) && pDocDisp)//如果成功
{
hRes = pDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc2);//判断是否成功获取IHTMLDocument2指针
if(SUCCEEDED(hRes) && pHtmlDoc2)//如果成功
{
hRes = pHtmlDoc2->get_parentWindow(&pWindow);//判断是否成功获得IHTMLWindow2 指针
if(SUCCEEDED(hRes) && pWindow)//如果成功
{
hRes = pWindow->get_navigator(&pNavigator);//判断是否成功获取IOmNavigator指针
if(SUCCEEDED(hRes) && pNavigator)//如果成功
{
。。。。。。。。。 }
}
}
}
}
}
return S_OK;
} http://zhidao.baidu.com/question/66833273.html
相关文章推荐
- 关于几个HTML文档接口的使用探讨
- 关于几个HTML文档接口的使用探讨
- 关于几个HTML文档接口的使用探讨
- 关于最近使用文档的几个技巧
- 关于最近使用文档的几个技巧
- 关于线程的几个方法的使用说明
- 探讨CMake中关于RPATH的使用
- LEADTOOLS中如何使用文档清理命令接口来清理文档图像
- 快递鸟代收货款接口API使用技术文档
- 关于struts中 html:errors 的使用方法之一
- 关于RabbitMQ-C入门使用需要注意的几个问题
- 关于HTML中<link>标签的使用。
- 关于HTML中<meta>标签的使用。
- 关于使用HtmlAgilityPack
- 关于日志API接口中流量的使用。
- 使用XSL将XML文档中的CDATA注释输出为HTML文本
- (转载)使用 jsoup 对 HTML 文档进行解析和操作
- 关于Html中的title属性内容换行,以及Bootstrap的tooltip的使用
- HTML中级教程 - 1.关于“Span”和“Div”的使用
- Windows phone 7中关于Zune软件使用几个问题