问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何:在ActiveX控件中获得顶层IWebBrowser2接口

发布网友 发布时间:2022-05-04 23:19

我来回答

2个回答

懂视网 时间:2022-05-05 03:40

说明了如何在控件中获得所在窗口的IWebBrowser2的引用。但是,开发者实际上经常需要的是饱含框架集的顶层IWebBrowser2的引用。例如,当你在网页载入之前调用statusText() 命令设置状态栏的值时可以用到。因为这个属性对WebBrowser控件无效,所以调用所在框架的IWebBrowser2的函数会产生错误。

更多信息

为获得顶层IWebBrowser2 引用, 从客户站点获取IServiceProvider 并且 执行一个QueryService 操作获取IID_IServiceProvider服务SID_STopLevelBrowser (在Shlguid.h中定义)。对第二个IServiceProvider,执行一个QueryService 获取IID_IWebBrowser2 服务SID_SWebBrowserApp.

干这个的最好的地方是在IOleObject的SetClientSite() 方法里面:

#include 

#define COMRELEASE(ptr)/
	if (ptr != NULL) {/
		ptr->Release();/
		ptr = NULL;/
	}

IWebBrowser2 *browser = NULL;

STDMETHODIMP SetClientSite(IOleClientSite *pClientSite)
{
	HRESULT hr = S_OK;
	IServiceProvider *isp, *isp2 = NULL;
	if (!pClientSite)
	{
		COMRELEASE(browser);
	}
	else
	{
		hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast(&isp));
		if (FAILED(hr))
		{
			hr = S_OK;
			goto cleanup;
		}
		hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast(&isp2));
		if (FAILED(hr))
		{
			hr = S_OK;
			goto cleanup;
		}
		hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast(&browser));
		if (FAILED(hr))
		{
			hr = S_OK;
			goto cleanup;
		}
	cleanup:
		// Free resources.
		COMRELEASE(isp);
		COMRELEASE(isp2);
		return hr;
	}
} 

参考

要更多信息,单击下面的文档编号查看微软知识库中的文章

Q172763 信息: 在ActiveX中访问对象模型

要更多关于开发基于Web的Internet Explorer解决方案,请访问下列站点:

http://msdn.microsoft.com/workshop/entry.asp

http://msdn.microsoft.com/ie/

http://support.microsoft.com/highlights/iep.asp?FR=0&SD=MSDN

© 微软公司 2000,保留所有权利

微软公司的Jay Andrew Allen 投稿

额外的查询关键字:IServiceProvider SID_STopLevelBrowser IWebBrowser2

关键字: kbActiveX kbCtrl kbIE kbIE400 kbGrpDSInet kbie500 kbDSupport kbie501 kbie550
文章类型 : kbhowto
技术 : kbIEsearch kbAudDeveloper kbSDKIESearch kbIE500Search kbSDKIE400 kbSDKIE401 kbSDKIE401SP1 kbSDKIE401SP2 kbSDKIE500 kbSDKIE501 kbSDKIE550 kbIE550Search

How To Retrieve the Top-Level IWebBrowser2 Interface from an ActiveX Control

2006/3/27 19:25:36

P {margin:0px;padding:0px;} body {font-size:10pt;font-family:Tahoma;}

http://support.microsoft.com/default.aspx?scid=kb;en-us;Q257717

How To Retrieve the Top-Level IWebBrowser2 Interface from an ActiveX Control

View products that this article applies to.

Article ID : 257717
Last Review : September 1, 2005
Revision : 2.2

This article was previously published under Q257717

SUMMARY

The Microsoft Knowledge Base article

172763 (http://support.microsoft.com/kb/172763/EN-US/) INFO: Accessing the Object Model from Within an ActiveX Control

explains how to obtain the IWebBrowser2 reference for the host window of an ActiveX control. However, often what developers actually want is a reference to the topmost IWebBrowser2, the one containing the frameset itself. This can be useful if you want to call the statusText() command, for example, to set the value of the window status box before the page has been loaded. Because this property does not function on the WebBrowser control, calling it from the IWebBrowser2 of the embedded frame results in an error.

MORE INFORMATION

To retrieve the top-level IWebBrowser2 reference, get IServiceProvider from the client site and perform a QueryService for IID_IServiceProvider under the service SID_STopLevelBrowser (defined in Shlguid.h). From this second IServiceProvider, perform a QueryService for IID_IWebBrowser2 in the SID_SWebBrowserApp service.

The best place to perform this work is in the SetClientSite() method of IOleObject:

#include

#define COMRELEASE(ptr)/
if (ptr != NULL) {/
ptr->Release();/
ptr = NULL;/
}

IWebBrowser2 *browser = NULL;

STDMETHODIMP SetClientSite(IOleClientSite *pClientSite)
{
HRESULT hr = S_OK;
IServiceProvider *isp, *isp2 = NULL;
if (!pClientSite)
{
COMRELEASE(browser);
}
else
{
hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast(&isp));
if (FAILED(hr))
{
hr = S_OK;
goto cleanup;
}
hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast(&isp2));
if (FAILED(hr))
{
hr = S_OK;
goto cleanup;
}
hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast(&browser));
if (FAILED(hr))
{
hr = S_OK;
goto cleanup;
}
cleanup:
// Free resources.
COMRELEASE(isp);
COMRELEASE(isp2);
return hr;
}
}

REFERENCES

For additional information, click the article number below to view the article in the Microsoft Knowledge Base:

172763 (http://support.microsoft.com/kb/172763/EN-US/) INFO: Accessing the Object Model from Within an ActiveX Control

For more information about developing Web-based solutions for Microsoft Internet Explorer, visit the following Microsoft Web sites:

http://msdn.microsoft.com/library/default.asp?url=/workshop/entry.asp (http://msdn.microsoft.com/library/default.asp?url=/workshop/entry.asp)

http://msdn.microsoft.com/ie/ (http://msdn.microsoft.com/ie/)

http://support.microsoft.com/iep (http://support.microsoft.com/iep)


APPLIES TO
Microsoft Internet Explorer 4.0 128-Bit Edition
Microsoft Internet Explorer 4.01 Service Pack 2
Microsoft Internet Explorer 4.01 Service Pack 1
Microsoft Internet Explorer 4.01 Service Pack 2
Microsoft Internet Explorer 5.0
Microsoft Internet Explorer 2.1
Microsoft Internet Explorer 2.01

Back to the top

Keywords:
kbhowto kbctrl KB257717

热心网友 时间:2022-05-05 00:48

但是,开发者实际上经常需要的是饱含框架集的顶层IWebBrowser2的引用。例如,当你在网页载入之前调用statusText() 命令设置状态栏的值时可以用到。因为这个属性对WebBrowser控件无效,所以调用所在框架的IWebBrowser2的函数会产生错误。做这件事情最适合的地方是在IOleObject的SetClientSite() 方法里面: #include #define COMRELEASE(ptr)/ if (ptr != NULL) {/ ptr->Release();/ ptr = NULL;/ } IWebBrowser2 *browser = NULL; STDMETHODIMP SetClientSite(IOleClientSite *pClientSite) { HRESULT hr = S_OK; IServiceProvider *isp, *isp2 = NULL; if (!pClientSite) { COMRELEASE(browser); } else { hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast(&isp)); if (FAILED(hr)) { hr = S_OK; goto cleanup; } hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast(&isp2)); if (FAILED(hr)) { hr = S_OK; goto cleanup; } hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast(&browser)); if (FAILED(hr)) { hr = S_OK; goto cleanup; } cleanup: // Free resources. COMRELEASE(isp); COMRELEASE(isp2); return hr; } } 参考要更多信息,单击下面的文档编号查看微软知识库中的文章 Q172763 信息: 在ActiveX中访问对象模型要更多关于开发基于Web的Internet Explorer解决方案,请访问下列站点:
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
kmose正确使用方法? 单位高温防护欠缺致员工中暑如何对待 狗狗为什么爱看视频 360浏览器怎么设置倍速播放 ...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 电信4G手机热点玩NS网速怎么样 在宿舍用电脑开热点怎么给NS加速哇 电脑上的微信视频图片如何保存?制作相册时从哪里找微信的照片? 微信里的视频可以像图片一样下载吗 请问qq和微信视频搞笑图片从那里下载 谢谢 快对作业要钱吗 山东春季高考分数线最低的专科学校有哪几个 求一份山东各专科学校往年春考分数线学校越多越好 山东省春季高考专科分数线是多少? 山东护理类春季高考专科往年分数线是多少 为什么steam饰品在steam市场上要8.9块而在国内饰品交易网站上贵一倍还有人买 如何看到那些,朋友圈设置分组可见 在微信朋友圈设置分组可见,请问我设置的组员们能看见组内成员都有谁么? 为什么steam饰品交易 为什么电脑QQ没办法参加接龙,也看不到群接龙? VPGAME无法绑定steam啊?进不了steam社区网站。 怎么在V5FOX平台买dota2饰品啊? 绝地求生国服上线后,我买饰品还能在V5FOX买吗?饰品能不能互通啊?  《绝地求生》在v5fox购买的衣服,想领到steam上,但它不让领咋办 QQ群接龙为什么老是获取详情失败 以前我QQ都可以群里接龙的,现在总是显示获取接龙详情失败? 百事可乐算辛辣刺激性食物吗? 任天堂ns连接手机热点能够下载,但是无法联网游戏,怎样能够改善网络状况,dns已改,也挂过ss 一罐600ml的百事可乐至少要加多少薄荷味的荷氏薄荷糖才能喷得很高? 朔州市朔城区第九小学教学质量怎么样? 你知道一瓶百事可乐中含糖量是几克吗[塑料瓶] 朔州市九小去市图书馆应乖几路公交? 朔州市直属小学全部归了城区这合理吗 百事可乐喝多了,对身体有影响吗 朔州市平朔小学有哪些 朔州市小学毕业时间 百事可乐轻怡(无糖.低卡路里)为什么还会甜呢? 和平里第九小学的校长简介 朔州市有几个实验小学,分别在哪儿?包括正在规划的小学。 安吉第九小学是公立的吗? 山西省太原市实力最好的小学,你听说过吗? 山西朔州教师谩骂学生,这暴露了什么问题? 山西大同大学朔州师范分校这个学校怎么样(师资和环境) 大竹第九小学好不好,想知道,关键是老师负不负责啊? 驻马店第九小学和第二小学哪个好? 平安易贷的“i贷”的费率高吗?