如何对webbrowser和IE编程(七)

加入高级功能

本节将展示如何加入高级功能到你的应用程序或者ActiveX控件.将展示如何从一个ActiveX控件中访问Internet Explorer的 IWebBrowser2,以及如何从一个Web页面的frame中获得WebBrowser 对象。将会展示实现一些并非容易实现的功能.本节有一定难度.所有代码采用C++ 和COM实现,你应当有一定坚实的基础才可以完成本节的理解

从ActiveX 控件中访问Internet Explorer 的IWebBrowser2

在Activx控件中访问IWebBrowser2 接口提供了用户定制浏览器的能力,虽然以此作为自己的控件功能不大光明,且你只能够在VC编写的activeX控件中访问。(尽管可以在VB写的控件中访问document和window控件,但是你不可以直接访问WebBrowser 自身) .

存取  IWebBrowser2 接口经过四个步骤:

1.     在类文件中包含 ExDisp.h .

2.        调用控件的站点的 IOleClientSite::GetContainer 方法,该方法返回由 Internet Explorer. 实现的 IOleContainer 接口的指针。

3.        如果步骤 2 成功,用 IOleContainer 指针查询 IServiceProvider 接口。 .

4.        如果步骤 3 成功 , 调用 IServiceProvider 的方法 QueryService 的到 IWebBrowser2 接口。

QueryService 方法携带3个参数. 第一个参数指定你想访问的服务。为得到IWebBrowser2 指针, 需要指定SID_SInternetExplorer 或者SID_SWebBrowserApp 来指定要访问的服务. (现阶段,他们全部定义为IID_IWebBrowserApp.) 第二个参数指定你想接收的接口的ID。此参数你应当指定为IID_IWebBrowser2. 最后,第三个参数你需要指定哪一个变量接收返回的接口指针。

Call any method or property of IWebBrowser2. 当完成后,确信你已经释放掉你获取的接口指针.以下为代码参数.



														


														


														

														


														

														






														


														


														

														



														


														


														
														


														

														




														


														


														
														


														

														



利用一个控件打印web页

早于5的Internet Explorer,通常用于ActiveX中 访问IWebBrowser2 接口以提供打印web页面的功能。尽管ie5允许你直接在web页的script中使用 window.print, 但是建立一个提供打印web页的功能的示范还是比较好教您使用IWebBrowser2接口的入门教程.在此之前,必要知道如何使用ATL建立一个activeX控件以实现打印功能. 关于此点,我将认为您已经知道如何使用ATL创建一个控件.

启动Visual C++, 新建 ATL DLL工程. 你可将工程命名为 AtlPrint. 下一步, 使用Wizard增加一个Lite Control 到你的工程。 你可以命名你的控件为PrintCtl. 为IPrintCtl 接口添加一个方法Print. 之后你将在脚本中使用此方法打印当前Web page.

在实现Print 方法前,首先包含ExDisp.h 和 shlguid.h 头文件到PrintCtl.cpp 实现文件.

下一步使用之前给出的获取IWebBrowser2 接口的方法获得接口并调用ExecWB 以实现打印当前Web页. 你可以使用ATL 智能接口指针类—CComPtr 以及 CComQIPtr—以实现查询接口处理引用次数等艰苦的工作.此处为智能指针示勇代码:




														






														




														

														





														




														









														


现在编译ATL ActiveX control. 为测试打印功能,你必须加入一些script. Listing 6-2 展示了这部分代码:

Listing 6-2.

PrintCtl.htm




														














当宿主WebBrowser控件的时候存取帧的IWebBrowser2 接口

如果一个Web 页包含了多帧,每一帧都包含了一个WebBrowser 对象。 当宿主WebBrowser 控件, 你将可被允许从应用程序访问WebBrowser 以控制帧.此控允许你控制以在帧中导航, 刷新, 以及诸如此类。一旦你拥有了一个帧中的 WebBrowser 对象的IWebrowser2 接口指针, 你可以掉用IWebrowser2 接口的任何方法和属性。

在VC++中你可以访问一个帧中的WebBrowser. VB中,你可在帧中存取document , 你可以访问WebBrowser 但是不可以访问装载于WebBrowser窗口中的HTML文档对象的 IoleContainer 接口. 存取 IOleContainer 要求访问帧的 WebBrowser 对象. 本节讲述VC++d的标准技术细节,即WebBrowser 控件的宿主能访问在包含的WebBrowser控件装载的web页面的帧窗口的WebBrowser对象模型.

下面的代码展示如何访问web页面的每一个帧的WebBrowser对象以刷新每一帧的内容.其中重要的片断用于用HTML document 对象的IOleContainer::EnumObjects  方法枚举页面中的embeddings(嵌入)对象. 每一个嵌入对象表现为一个控件. 利用IWebBrowser2 接口查询每一个控件对象,此代码可检测到控件是否是一个子帧.如果为获得 IWebBrowser2 而成功调用QueryInterface, 其结果为帧中的WebBrowser对象的引用. (数据成员m_webBrowser 是CWebBrowser2 类型的—MFC 包装类)





														



														





														


														



														


														


														


														







														


														







														


请留意在代码中我们首先通过GetDocument 方法获得了文档的IDispatch 对象指针, 该方法是WebBrowser 包装类的成员指针.然后我们访问文档的IOleContainer接口. IOleContainer 接口提供了能够枚举页面中全部嵌入对象的功能. 然后我们通过调用IOleContainer 的EnumObjects 方法得到枚举器(EnumObjects.EnumObjects 返回的 IEnumUnknown 接口的指针可以用于枚举全部嵌入(embeddings)对象. 代码的下一步, 我们遍历全部嵌入对象,查询每一个对象的IWebBrowser2 接口. 如果查询成功, 我们已经获得了帧的IWebBrowser2 接口指针.我们可以调用它的任何方法和属性,在此例中,我们仅仅调用了每一个帧的Refresh.

忠告

ActiveX 控件宿主于一个 html 页也有类似情。也许,如果你建立一个访问 ie 的 WebBrowser 控件或者页面帧中的 WebBrowser 的控件,不要将你的控件标记为脚本安全和初始化安全。 .

调用 查找, 察看源码, 以及 Internet 选项

浏览WebBrowser 控件的方法和属性, 你可轻易见到控件提供的功能.但是3个可编程由WebBrowser控件提供的项目不容易发觉到:查找对话框, 察看源代码菜单项,以及Internet选项对话框. 如果你曾经用过ie,你无疑很熟悉他们. 查找对话框, 允许你在WEB页中查找文本,通过处理 Ctrl-F 或者选择edit菜单的Find项来调用.

察看源代码菜单项,允许你显示WEB页的html代码, 可通过选择View菜单的Source项来选择或者右击web页(在弹处菜单中)选择察看源代码. Internet 选项对话框如图6-23所示, 可通过选择Tools菜单的Internet Option项来调用.

Figure 6-23. Internet Options dialog box.

能够在你的web应用中提供以上功能的确可以带来对用户的友善性,但是调用途径缺不是通过WebBrowser的方法和属性可以实现. 实际上你应当从调用IOleCommandTarget 的Exec 方法来调用实现于WebBrowser中的以上功能.当调用Exec, 你传递名为 CGID_IWebBrowser 的GUID 作为你想调用的命令的ID.尽管ExecWB 方法是IOleCommandTarget::Exec 方法的包装, 但是你不能够通过ExecWB 来调用 Find, View Source, 或者 Internet Options 对话框,以为ExecWB 不允许你指定命令组GUID. 那意味着该项技术仅能够用于VC++—你不能够直接从VB中调用。.

忠告

本代简要展示你未收入文档的命令组 GUID ,那意味着可以将来改编。尽管代码已经在 Internet Explorer 3.x, 4.x, 和 5 中测试 , ,但是不保证在将来的版本中成功运行

以下步骤实现 Find, View Source, 以及Internet Options 命令:

1.     定义WebBrowser 控件的命令组GUID:



2.        定义用于 Find, View Source, 和 Internet Options 的 ID:





3.        在需要的时候执行 Find, View Source, 和 Internet Options 命令 . 举例来说,你可创建工具方法接收命令 ID 并调用 IOleCommandTarget::Exec , 如下片断所示 . ( 注意在 MFC 代码中, m_webBrowser 是 WebBrowser 控件的实例 . 同样 , nCmdID 是定义的 ID)






														




														







														

														









														


分发WebBrowser 控件

现在你知道了如何利用WebBrowser控件和IE创建专用应用程序, 你大概感兴趣知道那些IE组件你需要打包在你的应用程序以便你的应用程序可以在系统商正常工作即使没有IE5被安装.无论你宿主 WebBrowser 控件还是自动化Internet Explorer, 你必须至少打包IE最小化安装的组件. 为理解为什么,请再一次察看图6-1展示的体系.你可以看到每一个组件是如何的依赖其他组件—而且这幅图仅仅展示了其表面.它未能展示webbrowser控件和IE多样特性的组件间的全部特征.因为由如此众多的组件调用,为了你的应用程序能够正常工作,你应当确信至少IE最小化安装于用户的操作系统.

别担心,你不需要打包每一个IE的组件.  Internet Explorer 5 安装程序允许你定制你的安装以使你打包你仅需的组件.另外, 如果你使用Internet Explorer Administration Kit (可在 http://ieak.microsoft.com/找到) 建立你的安装程序, 你可以将IE默认安装,免掉多个确认安装步骤的对话框.

时间: 2024-11-01 04:13:25

如何对webbrowser和IE编程(七)的相关文章

如何对webbrowser和IE编程(四)

寄宿WebBrowser 控件 我们现在开始在VB和VC中创建一些程序来寄宿(Host)WebBrowser控件.在你完成本部分的样本,你将对如何创建寄宿一个WebBrowser控件的应用程序又一个基本的了解.当你看到如此容易的加入Web浏览功能加入到你的应用程序,我相信你会立即开始实践的. 使用VB 在VB中,你可以在5分钟内开发一个全功能的自己的web浏览 .以下步骤为建立一个web浏览器程序: 1.     启动VB. 2.        选择" Standard EXE " ,

如何对webbrowser和IE编程(一)

一. 因为工作缘故,需要研究对 IE 编程,所以翻译了 MS 的有关资料,供参考.   IE 的体系   WebBrowser Host 首先,必须有 COM 的基础知识,因为 IE 本身就是 COM 技术的典型应用.我们看到最上层是 WebBrowser 的宿主( Host ),也就是任何你想重用(ReUse)webbrowser control 的应用程序,可以是 vb 程序,也可以是 vc 或者任何其他语言的应用程序.应用程序必须是可容纳 activex 控件的容器. Webbrowser

如何对webbrowser和IE编程(九)

接收事件的途径 依靠开发工具你创建客户应用程序,你可以接收事件通过不同的途径. 显然, 在Vb中接收事件同在VC中接收事件相比是如此不同和容易.在 C++ 应用中,你可以用不同的技术,通过使用 ATL, MFC, 或者标准C++. Visual Basic 中接收事件 Visual Basic是创建大多数类型应用的最轻松的工具, 所以我告诉你VB是处理事件最溶的工具时也不要惊奇. ATL 和 Visual Basic 示例我们同样的工作,但是ATL花费了我4个小时, 而 Visual Basic

如何对webbrowser和IE编程(十)

由Internet Explorer 5激发事件 如你所知, Internet Explorer像其他COM对象一样激发事件-通过连接点.但实际上Internet Explorer如何激发事件呢?每次 Internet Explorer需要向客户提供关于当前活动状态的信息, Internet Explorer 激发通过DWebBrowserEvents2 连接点激发一个事件. (之前到版本 4, Internet Explorer 通过 DWebBrowserEvents 接口激发事件.但到了版

如何对webbrowser和IE编程(十一)

仅仅用于Internet Explorer的事件 有些是仅仅可用于自动化 Internet Explorer,: ·         OnQuit OnVisible OnToolBar OnMenuBar OnStatusBar OnFullScreen OnTheaterMode 大多数这些事件属于浏览器用户接口. 另外一些必须要先是或者关闭Internet Explorer才发生. 一些情形中,这些事件将在你宿主webbrowser空间的时候发生. 举例来讲,当你在你的应用程序设置Menu

如何对webbrowser和IE编程(六)

使用VC++和COM API 尽管使用VC不像Vb中那么容易自动化IE,但是也不太难,尤其是你理解了CON和COM API.无论你使用MFC, ATL, 或者标准 C++自动化IE,方法都是一样-你使用COM API来实现. VC++中创建一个Internet Explorer实例包括要调用COM API CoCreateInstance ,指定第一个参数为 CLSID_InternetExplorer .创建IE自动化实例不像创建包含webbrowser的Activex控件困难.你不需要实现容

如何对webbrowser和IE编程(五)

自动化 Internet Explorer 自动化打开了开发基于web应用的世界. 它允许你使用VB或者VC定制成熟的应用.自动化的好处:通过属性和方法可以改变IE的外观:你可以提供诸如导航条等用户接口以便控制用户的导航. 自动化IE很容易.你建立一个简单的应用启动一个IE实例,然后使用控制webbrowser的途径- IWebBrowser2 接口来控制IE实例. 提醒 术语自动化( automation ) 真实的含义是通过自动化接口 -- IDispatch. 控制一个 COM 对象.但是

如何对webbrowser和IE编程(三)

IWebBrowserApp IWebBrowserApp 接口仅仅在IE中实现. 典型的,你使用InternetExplorer 对象创建一个IE的实例. 然后你使用 IWebBrowserApp 接口操纵此实例. (今天采用IWebBrowser2 替代) IWebBrowserApp 接口继承自 IWebBrowser, 所以它提供 IWebBrowser 的全部功能. 因为IWebBrowserApp呈现一个IE窗口的实例, 所以它的方法和属性典型地允许你控制浏览器窗口的用户接口. 这些

Java函数式编程(七):MapReduce_java

译注:map(映射)和reduce(归约,化简)是数学上两个很基础的概念,它们很早就出现在各类的函数编程语言里了,直到2003年Google将其发扬光大,运用到分布式系统中进行并行计算后,这个组合的名字才开始在计算机界大放异彩(那些函数式粉可能并不这么认为).本文我们会看到Java 8在摇身一变支持函数式编程后,map和reduce组合的首次亮相(这里只是初步介绍,后续还会有针对它们的专题). 对集合进行归约 现在为止我们已经介绍了几个操作集合的新技巧了:查找匹配元素,查找单个元素,集合转化.这