如何对webbrowser和IE编程(一)
IE 的体系
WebBrowser Host
首先,必须有 COM 的基础知识,因为 IE 本身就是 COM 技术的典型应用。我们看到最上层是 WebBrowser 的宿主( Host ),也就是任何你想重用(ReUse)webbrowser control 的应用程序,可以是 vb 程序,也可以是 vc 或者任何其他语言的应用程序。应用程序必须是可容纳 activex 控件的容器。
Webbrowser control 既是 activex control 也是 activex document 的宿主。作为控件,它可以置于任何 activex 容器,作为文档容器,它针对特殊的类型,调用特殊类型注册的文档 server 以显示文档。如果你想显示一个 .doc 文档, webbrowser control 装载 windows word, ,对于 html 文档, webbrowser 装载名为 mshtml 的组件 ( 如图所示 ) 。针对不同的文档,你不需要开发不同的应用,仅仅是调用 webbrowser control 即可。
Shdocvw
Shdocvw.dll 包含了 webbrowser control ,控制 webbrowser control ( 就像控制其他任何 activex com 控件一样 ) ,提供浏览能力给上层宿主。请注意 webbrowser control 位于第二级中。甚至 IE 也不直接而是通过 shdocw.dll 来使用 webbrowser control 的。尽管 shdocvw 提供了大部分的浏览功能,但是并不提供 IE 窗口的呈现功能。尽管如此, shdocvw 还是提供了简单创建 web 应用程序的能力。之后章节会讲到如何将 ie 的高级特性加入到你的应用程序。
MSHTML
早期的 mshtml 具有读取显示 html 的功能。 MSHTML 实际上是一个 active 文档服务器,但是却可以作为其他控件的容器(如图中所示的)。记得吗,你可以将activex 控件置于 html 中,此时 mshtml 就是一个 activex 宿主,还可以控制其他的控件如 vbscript 脚本引擎和 javascript 脚本引擎, java applet ,geszhong ,各种插件 — 别意外, plug-in 都是按照 ie activex 规范写的。
二、
WebBrowser Control 与 Internet Explorer
二者又太多的共同点,你都是通过 COM 接口来访问其功能。当调用 webbrowser 控件时,使用的是 webbrowser 对象,在 vc 中是使用 class ID CLSID_WebBrowser 的接口类。
当自动化 ie 时,必须建立名为 InternetExplorer 的对象, vc 等语言中使用名为 class ID CLSID_InternetExplorer 的接口类。
接口
webbrowser 有 4 个接口(如图),其中 3 个提供全部的功能,第 4 个 DWebBrowserEvents2 接口暴露事件
ie4 之前,仅有 IwebBrowser 和 IwebBrowserApp 两个接口,且二者共享相同的功能,当开发 ie4 时候,决定加入第三个接口 IWebBrowser2 扩展 webbrowser 的功能。该接口派生于第二个接口。
IWebBrowser
IWebBrowser 仅仅是 WebBrowser control 的最初接口, 提供基本的例如导航 web 页面的功能。 作为其他派生接口的基础接口,有 8 个方法和 30 个属性。
尽管WebBrowser control 提供了你需要的导航回退以及前向的方法,但是没有提供存取历史列表的途径. 你可与直接通过属性LocationUR来获取当前页的URL.
在VB或者VC++中调用GoBack 和 GoForward 方法式很容易的.你可以使用WebBrowser control 或者 Internet Explorer对象. 举例来讲, 在VB中你可以如下调用:
WebBrowser1.GoBack Hosting WebBrowser controlInternetExplorer1.GoForward Automating Internet Explorer object
m_webBrowser.GoBack(); // Hosting WebBrowser control
m_pInternetExplorer- GoForward(); // Automating Internet Explorer object
尽管 GoBack 和 GoForward 方法十分重要,当控制WebBrowser control或者自动化操作 Internet Explorer, Navigate is 却是最重要的方法. Navigate 允许你导航到特定的你所想的web页或者文件. Navigate 带有5个参数, 允许你指定特定的URL以实现导航以及其他定义导航行为的信息.
第一个参数是 URL, 指示web页的位置和名称或者何处的文件你想装载。 (次擦书类型是 BSTR.) URL 可以是你所使用的标准URL 协议类型的一种,例如HTTP 和 FILE, 或者是全路经文件名的本地文件系统, 例如 C:\MyFile.htm.
第二个参数, Flags, 你可指定如何或者甚至何处装载特定的URL. (参数的类型是指向 VARIANT的指针) Flags 的值来自名为 BrowserNavConstants 的枚举类型 ,定义于 ExDisp.h 头文件中且有6个值, 详细解释见下列表. 你可以指定一个或者多个Flags 参数值 (请留意有些当前并未实现).
· navOpenInNewWindow . 将导致一个新的窗口打开以显示URL. 缺省,如果你在自己的应用程序中控制 WebBrowser control,这些值将导致新的 Internet Explorer 浏览器窗口打开.
navNoHistory . 指定此 URL 将不加入到 URL 历史列表中 navNoReadFromCache . 当前未实现 . navNoWriteToCache . 当前未实现 . navAllowAutoSearch . 如果指定的 URL 未找到,自动搜索功能将试图导航到通常的顶级域名如 .com .net .org 以找到正确的 URL 。如果失败, URL 将传递给搜索引擎 . navBrowserBar . 如果可能,将 URL 装入到 Explorer 的地址栏 Bar 。第三个参数 TargetFrameName. 指定web页的哪一个frame将会发生导航. (参数的类型是指向 VARIANT的指针)此字符串将为以存在于web页中的名字或者一个指定的值如 _top 或 _search. _top 值指定 URL 将被当前最顶层web页装入并不在任何一个当前页中存在的frame. _search 指示搜索面板将被打开. (该值仅在你自动化操控Internet Explorer时发生.) 如果你指定的frame名称并未发现,, 新的Internet Explorer 窗口将被打开。
你可以使用 PostData 参数 (第四个)通过HTTPpost事务将指定特定的数据发送到服务器. (参数的类型是指向 VARIANT的指针) Post 处理用于将在HTML表单收集的数据发送到服务器。如果此参数不指定任何数据 , Navigate 方法将使用Get方法. 另外,如果你不指定 HTTP 协议的URL (换句话讲,如果你指定例如 FILE 协议的 URL), PostData 参数将被忽略。
你也可以使用第五个参数 , Headers, 以发送 HTTP 头信息到服务器 . (T 参数的类型是指向 VARIANT 的指针 ) 这些加入的头信息将被 WebBrowser 控件如常发送出去 . 作为 PostData 参数, 如果你并不指定第一个参数 , Headers 将被忽略 .Win32编程点滴3 - 简单ActiveX控件的使用 虽然这里一片的.net气氛,到处充斥着像MVC、WPF、WorkFlow、LINQ等各种niubility的术语。但我们使用的Windows还是由COM技术主宰着;我们在选择日常使用的软件时,也会避免使用.net开发的软件。
相关文章
- 学妹问我: 如何提高编程能力
- Win64 驱动内核编程-15.回调监控注册表
- Javascript模块化编程(一):模块的写法
- 没有基础或者基础差,如何快速学会编程?这4招绝对好使
- 课时 24:Kubernetes API 编程利器:Operator 和 Operator Framework(夙兴)
- 不编程也能爬虫?手把手教你如何从互联网采集海量数据
- 跟老男孩学Linux运维:Shell编程实战1.3 如何才能学好Shell编程之“老鸟”经验谈
- LFCS 系列第十讲:学习简单的 Shell 脚本编程和文件系统故障排除
- 编程小技巧9-如何生成没有水印的代码图片(IDEA carbon-now-sh插件使用教程)
- 《树莓派Python编程入门与实战》——1.5 决定如何购买外设
- 《树莓派Python编程入门与实战(第2版)》——1.5 决定如何购买外围设备
- SwiftUI macOS 如何编程控制SideBar侧边栏显示与隐藏(教程含源码)
- 程序员副业赚钱之我是如何通过编程实现财务独立的
- 个人总结的编程经验语录
- 我面向 Google 编程,他面向薪资编程
- 《树莓派Python编程指南》——2.2 一个Python游戏:猫和老鼠
- 高德地图 Android编程中 如何设置使 标记 marker 能够被拖拽
- 如何通过查源码的方式解决编程中遇到的问题?查源码定位问题的思路是什么?
- Java网络编程——UDP聊天程序
- 学习笔记(37):Python实战编程-yield实现生成器
- Oracle PL/SQL编程之变量
- Java多线程基础(一)---volatile关键字详解(并发编程特征、volatile关键字详解、volatile和synchronized区别)