设计用于 HTML 的控件

HTML 页上的控件由 <OBJECT> 和 </OBJECT> 标记指定。在处理 HTML 时,该控件即被创建并定位,而且设置了用 <param name> 标记的所有属性。

如果 <OBJECT> 标记包括任何 <PARAM NAME> 属性,则用标准的 PropertyBag 对象将这些属性提供的属性值传递到控件的 ReadProperties 事件。如“理解控件的存活期和关键事件”中所述。

一旦 HTML 页为活动的,附加在事件上的脚本就可能设置控件的属性值,这里,事件出现在该页上。

注意 如果除了(象 Top 和 Left 这样的)集合开展属性外不存在 <PARAM NAME> 属性,则控件可以接收到 InitProperties 事件而不是 ReadProperties 事件。这一行取决于浏览器的实现,但不依赖它。

Package and Deployment Wizard 通过 cabinet (.cab) 文件简化了对控件创建 Internet 安装的过程,在用户打开包含控件实例的 HTML 页时可自动卸载 cabinet (.cab) 文件。可分别卸载象 MSVBVM60.DLL 这样的支持文件。 P-code .ocx files 是非常紧凑的,所以,如果用户的计算机上已经有支持文件,则卸载将非常快。

Visual Basic 控件可支持数字签名、安全初始化以及安全设置脚本。.

重点 为了使用包括 HTML 页上的许可支持在内的控件,必须在 Web 服务器上安装控件部件的许可复制, Web 服务器提供了这一页。在本章后面的“控件的许可证问题”中对此进行了讨论。

在 HTML 页上使控件安全设置脚本及安全初始化

由于打开 World Wide Web 上的页而卸载的代码不能用公司名压缩包装,以保证其可靠性。当要求用户同意卸载时,他们可能会怀疑。如果想在页上使用您的控件,您必须向用户保证几件事项。

这个主题说明如何设计控件,使得在您创建 Internet 安装时可以将您的控件标记成安全设置脚本或安全初始化。

注意 Internet Explorer 的缺省设置是要显示警告信息并拒绝卸载已被标记成安全设置脚本或安全初始化的部件。

详细信息 有关数字签名、 cabinet 文件和 Internet 安装都可在 Microsoft Visual Basic Web 的站点上找到。

安全设置脚本

当 Web 的设计者将您的控件放到 HTML 页上时,他要使用象 JavaScript 或 Visual Basic, Scripting Edition 这样的脚本语言来访问控件的属性,调用它的方法,处理它的事件。通过将您的控件标记成安全设置脚本,您就可以提供一个隐含的保证。“不管是否用到 VBScript 或 JavaScript 代码,该控件都不能损害用户的计算机,或提供用户已自愿出让的信息。”

作为控件的作者,您有理由相信,控件在正常使用中不会破坏数据,也不会危及用户的计算机的安全。一旦控件在 Web 的设计器中,就不能保证按照您预期的方式来使用它了。

脚本安全性的关键

作为非安全设置脚本的控件实例,请考虑丰富文本框。RichTextBox 控件有一个 SaveFile 方法,可用这个方法将控件的内容写成文件。心存不良的人可能会把脚本写得使该控件覆盖操作系统文件,使用户的计算机失灵。

使控件不安全的不是由于它可以将信息保存在文件中,而是在于这样一个事实,即脚本能够指定文件名。通过这一观察就可知道创建安全设置脚本的控件的关键所在。只要控件不允许脚本为文件指定源或目标或注册操作,或者使用直接受脚本控制的 API调用,它就可能是脚本安全的。

于是,允许 Web 页设计器做以下任何事情的控件可能都不是安全设置脚本的控件:

安全与不安全之间的界线可能是很好的。例如,用 SaveSetting 方法将信息写到它自己的注册键去的控件不会因此而失去安全设置脚本的资格。另一方面,允许(通过设置属性或调用方法)指定注册键的控件并不安全。

使用临时文件的控件可能是安全设置脚本的。如果脚本能够控制临时文件名,则控件就不是安全设置脚本的了。甚至允许脚本控制进入临时文件的信息量,也会使控件非脚本安全,因为在用户的硬盘装满之前,脚本能够继续将信息转储到文件中。

在最后一个实例中,使用 API 调用的控件不必对脚本不安全。但是,假定控件允许脚本提供将要传递给 API 的数据,并且不防备多出的数据使内存溢出或使无效数据破坏内存。这样的控件不是脚本安全的。

现指出脚本安全性的严格性,请注意,VBScript 本身并不包括访问注册、保存文件或创建对象的方法。

选择子控件

可以认为,使用非安全设置脚本的子控件将自动使您的 ActiveX 控件对脚本不安全。这不一定为真。

如本章后面的“向控件添加属性”中所解释,子控件的属性和方法不会自动成为您的控件接口的部分。。 只要避免暴露使子控件不安全的属性和方法,就能在您自己的控件不安全的情况下使用它。

例如,如果使用 RichTextBox 作为子控件,就不应显露它的 SaveFile 方法。

重点 不要提供返回引用子控件的属性。脚本可用这个引用来访问使控件不安全的属性和方法。

对脚本安全性编档

确定控件是否安全,这并不是不值一提的小事。可以看到,把影响安全设置脚本的设计决策记录下来是有益的。练习构造包含以下内容的表将很有用处:

如果在这两个表的元素之间有关系存在,则控件可能对脚本不安全。

可希望有这样的由了解 ActiveX 控件和脚本的有经验的程序员检查过的文档。

安全初始化

标记了安全初始化的控件将隐含保证,无论怎样初始化属性,它都不会造成损害。

在 HTML 页上用具有 OBJECT 标记的 PARAM NAME 属性设置您的控件的初始状态,而且 OBJECT 标记将控件嵌入到页上。如果有恶意的 Web 设计器是您的 控件暗中取得信息,或将无效数据放在 PARAM NAME 中而造成损害,则您的控件不再对初始化安全。

预防而已数据的最好办法就是使控件中得到的每个属性值都有效。 Web 设计器放到 PARAM NAME 属性中的所有数据都通过 ReadProperties 事件中的 PropertyBag 对象提供给您的控件。(一个写得很好的控件应进行这一类验证,以防止因开发人员手动编辑 .frm 文件而引起的问题。)

详细信息 在 Microsoft Visual Basic Web 的站点上可看到有关编写 Internet 的控件的最新信息。

使用 Show 和 Hide 事件

在 Web 主页上,Show 和 Hide 事件非常有用。当控件执行某个资源消耗型的任务时,例如显示视频图象或不断地下载并显示股票信息的情况,在 Hide 事件发生时可以暂停该任务。

Hide 事件意味着使用者转移到了另一页,并把控件所在的页委派给“历史”列表。Show 事件意味着使用者返回到该页,因此,将继续执行资源消耗型的显示任务。

详细信息 在本章前面的“了解控件存活期和 Key 事件”中讨论了Show 和 Hide 事件。

使用 Parent 和 ParentControls 属性

可用 UserControl 对象的 Parent 属性访问容器。例如,在 Internet 资源管理器中,下列代码将改变控件所在的 HTML 页的背景色:

Parent.Script.get_document.bgColor = "Blue"

有关 Internet Explorer Scripting Object Model的更多信息,可在 Microsoft’s Web 站点上查找。

重点 为调用 Internet Explorer Scripting Object Model ,总要使用事后连结。使用事前连结将总会在将来引起兼容性问题,而事后连结却总能工作。

ParentControls 集合

ParentControls 集合允许访问您的控件所在的容器上的其它控件。在某些容器上,比如 Internet Explorer , ParentControls 将返回扩展对象,其属性和方法不会与控件的属性和方法合并。这就防止访问控件本身。

为访问 HTML 页上的其它控件,可将 ParentControls 集合上的 ParentControlsType 属性设置成 vbNoExtender。因此, ParentControls 集合将返回无扩展的控件本身的接口。

ParentControls.ParentControlsType = vbNoExtender

注意 Parent 属性和 ParentControls 集合可与其它许多容器并用。并不把它们局限于 HTML 浏览器。