现有 ActiveX 控件(以前为 OLE 控件)可以在 Internet 上使用,而无需修改。 但是,你可能想要修改控件以提高其性能。
重要
ActiveX 是一项不推荐用于新开发的旧技术。 有关取代 ActiveX 的新式技术的详细信息,请参阅 ActiveX 控件。 在更高版本的 Internet Explorer 中弃用了对 ActiveX 控件的支持,新式浏览器不支持。 Microsoft不再提供 Web 可访问的 ActiveX 组件。
在网页上使用控件时,还有其他一些考虑因素。 .ocx 文件和所有支持文件必须位于目标计算机上或通过 Internet 下载。 这使得代码大小和下载时间成为重要的考虑因素。 下载可以打包到已签名的 .cab 文件中。 您可以将控件标记为对于脚本化或初始化是安全的。
本文讨论以下主题:
还可以添加优化,如 ActiveX 控件:优化中所述。 名字对象可用于异步下载属性和大型 BLOB,如 Internet 上的 ActiveX 控件中所述。
打包用于下载的代码
有关此主题的详细信息,请参阅 打包 ActiveX 控件。
CODEBASE 标记
ActiveX 控件使用 <OBJECT> 标记嵌入在网页中。 标记 CODEBASE 的参数 <OBJECT> 指定要从中下载控件的位置。 CODEBASE 可以成功指向多种不同的文件类型。
将 CODEBASE 标记与 OCX 文件配合使用
CODEBASE="http://example.contoso.com/mycontrol.ocx#version=4,
70,
0,
1086"
此解决方案仅下载控件的 .ocx 文件,并且要求在客户端计算机上安装任何支持 DLL。 这适用于使用 Visual C++ 生成的 Internet Explorer 和 MFC ActiveX 控件,因为 Internet Explorer 附带了 Visual C++ 控件的支持 DLL。 如果支持 ActiveX 控件的另一个 Internet 浏览器用于查看此控件,则此解决方案将不起作用。
将 CODEBASE 标记与 INF 文件配合使用
CODEBASE="http://example.contoso.com/trustme.inf"
.inf 文件将控制 .ocx 及其支持文件的安装。 不建议使用此方法,因为无法对 .inf 文件进行签名(请参阅代码签名上的指针的 签名代码 )。
将 CODEBASE 标记与 CAB 文件配合使用
CODEBASE="http://example.contoso.com/acontrol.cab#version=1,
2,
0,
0"
Cabinet 文件是使用 MFC 打包 ActiveX 控件的推荐方法。 在 Cabinet 文件中打包 MFC ActiveX 控件,可以包含 .inf 文件以控制 ActiveX 控件及其所有依赖 DLL(例如 MFC DLL)的安装。 使用 CAB 文件会自动压缩代码,以便更快地下载。 如果使用 .cab 文件进行组件下载,则签署整个 .cab 文件比每个单独的组件更快。
创建 CAB 文件
用于创建 Cabinet 文件的工具现在是 Windows SDK 的一部分。
CODEBASE 指向的 Cabinet 文件应包含 ActiveX 控件的 .ocx 文件和用于控制其安装的 .inf 文件。 您可以通过指定控件文件的名称和一个 .inf 文件来创建 Cabinet 文件。 不要在此 Cabinet 文件中包含可能已存在于系统上的依赖 DLL。 例如,MFC DLL 在单独的 Cabinet 文件中打包并通过控制 .inf 文件来引用。
有关如何创建 CAB 文件的详细信息,请参阅 创建 CAB 文件。
INF 文件
以下示例 spindial.inf 列出了 MFC Spindial 控件所需的支持文件和版本信息。 mfc42.cab 由 Microsoft 提供和签名。
Contents of spindial.inf:
[mfc42installer]
file-win32-x86=http://example.contoso.com/controls/vc/mfc42.cab
[Olepro32.dll] - FileVersion=5,
0,
4261,
0
[Mfc42.dll] - FileVersion=6,
0,
8168,
0
[Msvcrt.dll] - FileVersion=6,
0,
8168,
0
<OBJECT> 标记
下面的示例演示如何使用 <OBJECT> 标记打包 MFC Spindial 示例控件。
<OBJECT ID="Spindial1" WIDTH=100 HEIGHT=51
CLASSID="CLSID:06889605-B8D0-101A-91F1-00608CEAD5B3"
CODEBASE="http://example.contoso.com/spindial.cab#Version=1,0,0,001">
<PARAM NAME="_Version" VALUE="65536">
<PARAM NAME="_ExtentX" VALUE="2646">
<PARAM NAME="_ExtentY" VALUE="1323">
<PARAM NAME="_StockProps" VALUE="0">
<PARAM NAME="NeedlePosition" VALUE="2">
</OBJECT>
在这种情况下,spindial.cab 将包含两个文件:spindial.ocx 和 spindial.inf。 以下命令将生成 Cabinet 文件:
C:\CabDevKit\cabarc.exe -s 6144 N spindial.cab spindial.ocx spindial.inf
参数 -s 6144 在柜中保留了一块用于代码签名的空间。
版本标记
请注意,CAB 文件指定的 #Version 信息适用于 标记的 CLASSID 参数指定的控件<OBJECT>。
根据指定的版本,您可以强制下载控件。 有关 OBJECT 标签的完整规范,包括 CODEBASE 参数,请参阅 W3C 参考文献。
在脚本和初始化中将控件标记为安全
网页中使用的 ActiveX 控件应标记为脚本安全和初始化安全,如果它们确实安全。 安全控制不会执行磁盘 IO 或直接访问计算机的内存或寄存器。
可通过注册表将控件标记对于脚本和初始化是安全的。 修改 DllRegisterServer 以添加类似于以下内容的条目,将此控件在注册表中标记为可用于脚本和持久化的安全控件。 另一种方法是实现 IObjectSafety。
你将为控件定义 GUID(全局唯一标识符),以标记其在脚本和持久性方面的安全性。 可以安全编写脚本的控件将包含如下所示的注册表项:
HKEY_CLASSES_ROOT\Component Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
可以从持久性数据安全地初始化的控件被标记为对于与类似于下面的注册表项的持久性是安全的:
HKEY_CLASSES_ROOT\Component Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
添加类似于以下内容(替换控件的类 ID 代替 {06889605-B8D0-101A-91F1-00608CEAD5B3})的条目,将密钥与以下类 ID 相关联:
HKEY_CLASSES_ROOT\CLSID\{06889605-B8D0-101A-91F1-00608CEAD5B3}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
HKEY_CLASSES_ROOT\CLSID\{06889605-B8D0-101A-91F1-00608CEAD5B3}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
许可问题
如果要在网页上使用许可控件,则必须验证许可协议是否允许其在 Internet 上使用,并为其创建许可证包文件(LPK)。
如果运行 Internet Explorer 的计算机未获得使用该控件的许可,则许可的 ActiveX 控件将不会在 HTML 页面中正确加载。 例如,如果使用 Visual C++ 生成许可控件,则使用该控件的 HTML 页面将在生成控件的计算机上正确加载,但除非包含许可信息,否则不会加载到其他计算机上。
若要在 Internet Explorer 中使用许可的 ActiveX 控件,必须检查供应商的许可协议,以验证控制许可证是否允许:
重新分发
控件在 Internet 上的使用
Codebase 参数的使用
若要在无许可计算机上 HTML 页面中使用许可控件,必须生成许可证包文件(LPK)。 LPK 文件包含 HTML 页中许可控件的运行时许可证。 此文件通过 ActiveX SDK 附带的LPK_TOOL.EXE生成。
若要创建 LPK 文件
在有权使用该控件的计算机上运行LPK_TOOL.EXE。
在 “许可证包创作工具” 对话框中的 “可用控件 ”列表框中,选择将在 HTML 页上使用的每个许可 ActiveX 控件,然后单击“ 添加”。
单击“ 保存并退出 ”,然后键入 LPK 文件的名称。 这将创建 LPK 文件并关闭应用程序。
在 HTML 页面上嵌入许可的控件
- 编辑 HTML 页面。 在 HTML 页中,在任何其他 <OBJECT> 标记之前插入一个用于 License Manager 对象的 <OBJECT> 标记。 许可证管理器是随 Internet Explorer 一起安装的 ActiveX 控件。 其类 ID 如下所示。 将 License Manager 对象的 LPKPath 属性设置为 LPK 文件的路径和名称。 每个 HTML 页面只能有一个 LPK 文件。
<OBJECT CLASSID = "clsid:5220cb21-c88d-11cf-b347-00aa00a28331">
<PARAM NAME="LPKPath" VALUE="relative URL to .LPK file">
</OBJECT>
在许可证管理器标记后面,为已许可的控件插入一个 <OBJECT> 标记。
例如,显示Microsoft屏蔽的编辑控件的 HTML 页面如下所示。 第一个类 ID 用于许可证管理器控件,第二类 ID 用于掩码编辑控件。 更改标记以指向前面创建的 .lpk 文件的相对路径,并添加对象标记,包括控件的类 ID。
<如果使用 NCompass ActiveX 插件,请为 LPK 文件插入 EMBED> 属性。
如果可在其他启用 Active 的浏览器(例如,使用 NCompass ActiveX 插件的 Netscape)上查看你的控件,则必须添加 <EMBED> 语法,如下所示。
<OBJECT CLASSID="clsid:5220cb21-c88d-11cf-b347-00aa00a28331">
<PARAM NAME="LPKPath" VALUE="maskedit.lpk">
<EMBED SRC = "maskedit.LPK">
</OBJECT>
<OBJECT CLASSID="clsid:C932BA85-4374-101B-A56C-00AA003668DC" WIDTH=100 HEIGHT=25>
</OBJECT>
有关控制许可的详细信息,请参阅 ActiveX 控件:授权 ActiveX 控件。
签名代码
代码签名旨在标识源代码,并保证代码自签名以来未更改。 根据浏览器安全设置,在下载代码之前,可能会警告用户。 用户可以选择信任某些证书所有者或公司,在这种情况下,将下载由这些受信任用户签名的代码,且不会发出警告。 代码经过数字签名以避免篡改。
确保最终代码已签名,以便可以自动下载控件,而无需显示信任警告消息。 有关如何对代码进行签名的详细信息,请查看 ActiveX SDK 中 Authenticode 的文档,并查看 对 CAB 文件进行签名。
根据信任和浏览器安全级别设置,可能会显示证书来标识签名人员或公司。 如果已签名控件的证书所有者被信任,或者安全级别为无,则不会显示证书。 有关浏览器安全设置如何确定是否已下载控件以及显示证书的详细信息,请参阅 Internet Explorer 浏览器安全级别和控制行为 。
数字签名保证代码自签名以来未发生更改。 在证书中采用并嵌入了代码哈希。 此哈希随后会与代码下载后但尚未运行前采用的代码哈希进行比较。 Verisign 等公司可以提供对代码进行签名所需的私钥和公钥。 ActiveX SDK 附带 MakeCert,这是用于创建测试证书的实用工具。
管理调色板
容器确定调色板并将其作为环境属性提供, DISPID_AMBIENT_PALETTE。 容器(例如 Internet Explorer)选择一个调色板,页面上的所有 ActiveX 控件都会使用这个调色板来确定它们自己的颜色方案。 这可以防止显示闪烁并呈现一致的外观。
控件可重写 OnAmbientPropertyChange 来处理调色板发生更改的通知。
控件可重写 OnGetColorSet 来返回绘制调色板的颜色集。 容器使用返回值来确定控件是否感知调色板。
在 OCX 96 准则下,控件必须总是在后台实现其调色板。
不使用环境调色板属性的较旧容器将发送WM_QUERYNEWPALETTE和WM_PALETTECHANGED消息。 控件可重写 OnQueryNewPalette 和 OnPaletteChanged 来处理这些消息。
Internet Explorer 浏览器安全级别和控制行为
浏览器具有安全级别选项,可由用户配置。 由于网页可能包含可能损害用户计算机的活动内容,浏览器允许用户选择安全级别的选项。 根据浏览器实现安全级别的方式,可能根本不下载控件,或者将显示证书或警告消息,以允许用户在运行时选择是否下载控件。 下面列出了 Internet Explorer 中高、中、低安全级别的 ActiveX 控件的行为。
高安全模式
不会下载未签名的控件。
如果不受信任,签名控件将显示证书(用户可以从现在开始选择始终信任此证书所有者中的代码的选项)。
只有标记为安全的控件具有持久性数据和/或可编写脚本。
中等安全模式
未签名的控件在下载之前将显示警告。
如果不受信任,则签名控件将显示证书。
未标记为安全的控件将显示警告。
低安全模式
控件下载时没有警告。
脚本和持久性在没有警告的情况下发生。
另请参阅
MFC 互联网编程任务
MFC Internet 编程基础知识
MFC ActiveX 控件:授权 ActiveX 控件