升级现有 ActiveX 控件

现有 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"

内阁文件是打包使用 MFC 的 ActiveX 控件的建议方法。 在内阁文件中打包 MFC ActiveX 控件允许包含 .inf 文件来控制 ActiveX 控件和任何依赖 DLL(如 MFC DLL)的安装。 使用 CAB 文件会自动压缩代码,以便更快地下载。 如果使用 .cab 文件进行组件下载,则签署整个 .cab 文件比每个单独的组件更快。

创建 CAB 文件

用于创建内阁文件的工具现在是 Windows SDK 的一部分。

指向 CODEBASE 的内阁文件应包含 ActiveX 控件的 .ocx 文件以及用于控制其安装的 .inf 文件。 通过指定控件文件和 .inf 文件的名称来创建内阁文件。 不要在此内阁文件中包括系统上可能已存在的依赖 DLL。 例如,MFC DLL 打包在单独的内阁文件中,并由控制 .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。 以下命令将生成内阁文件:

C:\CabDevKit\cabarc.exe -s 6144 N spindial.cab spindial.ocx spindial.inf

参数 -s 6144 在内阁中保留用于代码签名的空间。

版本标记

请注意,#Version使用 CAB 文件指定的信息适用于由标记的 <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 页面将在生成控件的计算机上正确加载,但除非包含许可信息,否则不会加载到其他计算机上。

若要在 Internet Explorer 中使用许可的 ActiveX 控件,必须检查供应商的许可协议,以验证控制许可证是否允许:

  • 重新分发

  • 在 Internet 上使用控件

  • 使用 Codebase 参数

若要在无许可计算机上 HTML 页面中使用许可控件,必须生成许可证包文件(LPK)。 LPK 文件包含 HTML 页中许可控件的运行时许可证。 此文件通过 ActiveX SDK 附带的LPK_TOOL.EXE生成。

创建 LPK 文件

  1. 在有权使用该控件的计算机上运行LPK_TOOL.EXE。

  2. “许可证包创作工具” 对话框中的 “可用控件 ”列表框中,选择将在 HTML 页上使用的每个许可 ActiveX 控件,然后单击“ 添加”。

  3. 单击“ 保存并退出 ”,然后键入 LPK 文件的名称。 这将创建 LPK 文件并关闭应用程序。

在 HTML 页面上嵌入许可的控件

  1. 编辑 HTML 页面。 在 HTML 页中,在任何其他 <OBJECT 标记之前插入<>许可证管理器对象的 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>
  1. 在 <许可证管理器标记之后插入许可控件的 OBJECT> 标记。

    例如,显示Microsoft屏蔽的编辑控件的 HTML 页面如下所示。 第一个类 ID 用于许可证管理器控件,第二类 ID 用于掩码编辑控件。 更改标记以指向前面创建的 .lpk 文件的相对路径,并添加对象标记,包括控件的类 ID。

  2. <如果使用 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 文件进行签名

根据信任和浏览器安全级别设置,可能会显示证书来标识签名人员或公司。 如果安全级别为 none,或者如果已签名控件的证书所有者受信任,则不会显示证书。 有关浏览器安全设置如何确定是否已下载控件以及显示证书的详细信息,请参阅 Internet Explorer 浏览器安全级别和控制行为

数字签名保证代码自签名以来未发生更改。 在证书中获取并嵌入代码的哈希。 稍后将此哈希与下载代码后所获取的代码的哈希进行比较,但在运行代码之前。 Verisign 等公司可以提供对代码进行签名所需的私钥和公钥。 ActiveX SDK 附带 MakeCert,这是用于创建测试证书的实用工具。

管理调色板

容器确定调色板并将其作为环境属性提供, DISPID_AMBIENT_PALETTE。 容器(例如 Internet Explorer)选择页面上所有 ActiveX 控件用来确定其自己的调色板。 这可以防止显示闪烁并呈现一致的外观。

控件可以重写 OnAmbientPropertyChange 以处理对调色板的更改通知。

控件可以重写 OnGetColorSet 以返回用于绘制调色板的颜色集。 容器使用返回值来确定控件是否感知调色板。

根据 OCX 96 准则,控件必须始终在后台实现其调色板。

不使用环境调色板属性的较旧容器将发送WM_QUERYNEWPALETTE和WM_PALETTECHANGED消息。 控件可以重写 OnQueryNewPaletteOnPaletteChanged 处理这些消息。

Internet Explorer 浏览器安全级别和控制行为

浏览器具有安全级别选项,可由用户配置。 由于网页可能包含可能损害用户计算机的活动内容,浏览器允许用户选择安全级别的选项。 根据浏览器实现安全级别的方式,可能根本不下载控件,或者将显示证书或警告消息,以允许用户在运行时选择是否下载控件。 下面列出了 Internet Explorer 中高、中、低安全级别的 ActiveX 控件的行为。

高安全模式

  • 不会下载未签名的控件。

  • 如果不受信任,签名控件将显示证书(用户可以从现在开始选择始终信任此证书所有者中的代码的选项)。

  • 只有标记为安全的控件具有持久性数据和/或可编写脚本。

中等安全模式

  • 未签名的控件在下载之前将显示警告。

  • 如果不受信任,则签名控件将显示证书。

  • 未标记为安全的控件将显示警告。

低安全模式

  • 控件下载时没有警告。

  • 脚本和持久性在没有警告的情况下发生。

另请参阅

MFC 互联网编程任务
MFC Internet 编程基础知识
MFC ActiveX 控件:授权 ActiveX 控件