升级现有 ActiveX 控件
现有 ActiveX 控件(以前称为 OLE 控件)无需修改即可在 Internet 上使用。 但是,您可能希望修改控件以提高其性能。
重要
ActiveX 是旧技术,不应用于新开发。 有关取代 ActiveX 的新式技术的详细信息,请参阅 ActiveX 控件。 对 ActiveX 控件的支持在较高版本的 Internet Explorer 中已被弃用,并且在新式浏览器中不受支持。 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 已安装在客户端计算机上。 这适用于 Internet Explorer 和使用 Visual C++ 构建的 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
参数在 Cabinet 中为代码签名保留了空间。
版本标记
请注意,CAB 文件指定的 #Version
信息适用于 <OBJECT>
标记的 CLASSID 参数指定的控件。
根据指定的版本,您可以强制下载控件。 有关 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 页将在生成该控件的计算机上正确加载,但 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> 标记前为许可证管理器对象插入一个 <OBJECT> 标记。 许可证管理器是与 Internet Explorer 一起安装的 ActiveX 控件。 其类 ID 如下所示。 将许可证管理器对象的 LPKPath 属性设置为 LPK 文件的路径和名称。 每个 HTML 页面只能有一个 LPK 文件。
<OBJECT CLASSID = "clsid:5220cb21-c88d-11cf-b347-00aa00a28331">
<PARAM NAME="LPKPath" VALUE="relative URL to .LPK file">
</OBJECT>
在许可证管理器标记后面,为已许可的控件插入一个 <OBJECT> 标记。
例如,显示 Microsoft Masked Edit 控件的 HTML 页如下所示。 第一个类 ID 用于许可证管理器控件,第二个类 ID 用于 Masked Edit 控件。 将标记更改为指向之前创建的 .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 中的验证码的文档,并参阅对 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 Internet 编程任务
MFC Internet 编程基础知识
MFC ActiveX 控件:许可 ActiveX 控件