关闭

升级现有的 ActiveX 控件

标签: internetmfcmicrosoftobject浏览器manager
2337人阅读 评论(0) 收藏 举报
分类:

升级现有的 ActiveX 控件

现有的 ActiveX 控件(即以前的 OLE 控件)不用修改即可用于 Internet。但是,您可能希望修改控件以提高它们的性能。当在 Web 页上使用控件时,还需要考虑其他一些问题。.ocx 文件和其他的支持文件必须位于目标计算机上或从 Internet 上下载。这使代码大小和下载时间成为重要的考虑因素。下载可打包在签名 .cab 文件中。可将控件标记为对脚本撰写是安全的和对初始化是安全的。

本文讨论下面的主题:

也可以添加优化,详见 ActiveX 控件:优化。名字对象可用于异步下载属性和较大的 BLOB,详见 Internet 上的 ActiveX 控件

打包代码以下载

有关本主题的更多信息,请参见知识库文章“将 MFC 控件打包以便在 Internet 上使用”(Q167158)。可以在 MSDN Library CD-ROM 中或 http://support.microsoft.com/support 上找到知识库文章。

CODEBASE 标记

ActiveX 控件使用 <OBJECT> 标记嵌入 Web 页中。<OBJECT> 标记的 CODEBASE 参数指定应从何处下载控件。CODEBASE 可成功指向许多不同的文件类型。

对 OCX 文件使用 CODEBASE 标记

CODEBASE="http://example.microsoft.com/mycontrol.ocx#version=4,70,0,1086"

此解决方案仅下载控件的 .ocx 文件,并要求所有的支持 DLL 均已安装在客户机上。它适用于 Internet Explorer 和使用 Visual C++ 生成的 MFC ActiveX 控件,因为 Internet Explorer 带有对 Visual C++ 控件的 DLL 支持。如果使用其他支持 ActiveX 控件的 Internet 浏览器查看此控件,则此解决方案无效。

对 INF 文件使用 CODEBASE 标记

CODEBASE="http://example.microsoft.com/trustme.inf"

.inf 文件控制 .ocx 文件及其支持文件的安装。不推荐使用此方法,因为不可能签名 .inf 文件(有关代码签名的指针,请参见签名代码)。

对 CAB 文件使用 CODEBASE 标记

CODEBASE="http://example.microsoft.com/acontrol.cab#version=1,2,0,0"

推荐使用压缩文件将使用 MFC 的 ActiveX 控件打包。通过在压缩文件中打包 MFC ActiveX 控件,可以包含一个 .inf 文件来控制 ActiveX 控件以及任何依赖 DLL(如 MFC DLL)的安装。使用 CAB 文件可自动压缩代码,从而加快下载速度。如果使用 .cab 文件进行组件下载,则签名整个 .cab 文件要比分别签名每个组件快。

创建 CAB 文件

可从 MSDN Web 站点 http://msdn.microsoft.com/workshop/management/cab/cabdl.asp 上获取 CABinet Development Kit(Web 链接如有更改,恕不另行通知)。在此工具包中可找到构造压缩文件的必备工具。

CODEBASE 指向的压缩文件中,应包含用于 ActiveX 控件的 .ocx 文件和一个控制控件安装的 .inf 文件。应通过指定控件文件和 .inf 文件的名称来创建压缩文件。不要在此压缩文件中包含可能已经存在于系统中的依赖 DLL。例如,应将 MFC DLL 打包在一个单独的压缩文件中,并通过控制 .inf 文件引用它。

有关如何创建 CAB 文件的详细信息,请参见创建 CAB 文件

INF 文件

下面名为 spindial.inf 的文件示例列出了 MFC Spindial 控件所需的支持文件和版本信息。请注意,MFC DLL 的位置是一个 Microsoft Web 站点。mfc42.cab 由 Microsoft 提供并签名。

Contents of spindial.inf:
[mfc42installer] 
file-win32-x86=http://activex.microsoft.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.microsoft.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 在压缩文件中保留了用于代码签名的空间。

版本标记

这里请注意,用 CAB 文件指定的 #Version 信息应用于 <OBJECT> 标记的 CLASSID 参数指定的控件。

根据所指定的版本,可强制进行控件下载。有关包含 CODEBASE 参数的 OBJECT 标记的完成规范,请参见 W3C 参考资料。

将控件标记为脚本安全和初始化安全

如果 Web 页使用的 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} 

授权问题

如果希望在 Web 页上使用授权控件,则必须验证许可协议是否可以在 Internet 上使用,并为其创建一个授权包文件 (LPK)。

对于授权的 ActiveX 控件,如果运行 Internet Explorer 的计算机未获得使用该控件的许可,则该控件将不会正确地加载在 HTML 页中。例如,如果是使用 Visual C++ 生成的授权控件,则使用该控件的 HTML 页将在生成该控件的计算机上正确加载,但其他的计算机除非包含授权信息,否则该页将不会加载到这些计算机上。

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

  • 重新发布
  • 在 Internet 上使用该控件
  • 使用 Codebase 参数

若要在一台未授权的计算机上的 HTML 页中使用授权控件,则必须生成一个授权包文件 (LPK)。LPK 文件包含 HTML 页中授权控件的运行时许可。此文件通过 ActiveX SDK 附带的 LPK_TOOL.EXE 生成。有关更多信息,请参见 MSND Web 站点 http://microsoft.com/china/msdn

创建 LPK 文件

  1. 在授权的计算机上运行 LPK_TOOL.EXE 以使用控件。
  2. 在“许可包创作工具”对话框中的“可用控件”列表框内,选择将用于 HTML 页的每个授权 ActiveX 控件,并单击“添加”。
  3. 单击“保存并退出”并为 LPK 文件键入名称。这将创建 LPK 文件并关闭应用程序。

在 HTML 页上嵌入授权控件

  1. 编辑 HTML 页。在 HTML 页中,将 License Manager 对象的 <OBJECT> 标记插入到任何其他的 <OBJECT> 标记之前。License Manager 是一个用 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>
  2. 将授权控件对象的 <OBJECT> 标记插入到 License Manager 标记之后。

    例如,一个显示 Microsoft Masked Edit 控件的 HTML 页如下所示。第一个类 ID 是 License Manager 控件的,第二个类 ID 是 Masked Edit 控件的。更改标记,使其指向先前创建的 .lpk 文件的相对路径,并添加包含控件类 ID 的对象标记。

  3. 如果使用 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(一个创建测试证书的实用工具),以及 wvtston.reg 和 wvtstoff.reg 这两个注册文件,用于指定浏览器是否应将测试证书识别为有效。

管理调色板

容器确定调色板并使其可用作环境属性 DISPID_AMBIENT_PALETTE。容器(例如 Microsoft Internet Explorer)选择一个调色板,由所有 ActiveX 控件在页上用来确定自己的调色板。这将防止闪烁并显示持续的外观。

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

控件可重写 OnGetColorSet 以返回绘制调色板的颜色设置。容器使用返回值确定控件是否识别调色板。

根据 OCX 96 指南,控件必须总是在背景中实现其调色板。

较旧的容器不使用环境调色板属性,它们将发出 WM_QUERYNEWPALETTEWM_PALETTECHANGED 消息。控件可通过重写 OnQueryNewPaletteOnPaletteChanged 来处理这些消息。

Internet Explorer 浏览器的安全性级别和控件行为

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

高级安全模式

  • 不下载未签名的控件。
  • 如果签名控件不可信,将显示证书(用户可选择一个选项以便今后始终信任来自该证书所有者的代码)。
  • 只有标记为安全的控件才含有持久性数据和/或可以编写脚本。

中级安全模式

  • 下载未签名控件之前显示警告。
  • 如果签名控件不可信,将显示证书。
  • 未标记为安全的控件将显示一个警告。

低级安全模式

  • 下载控件时不发出警告。
  • 发生脚本撰写和持久性时不发出警告。

请参见

MFC Internet 编程任务 | MFC Internet 编程基础 | ActiveX 控件:授权 ActiveX 控件

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:235508次
    • 积分:3265
    • 等级:
    • 排名:第10796名
    • 原创:58篇
    • 转载:156篇
    • 译文:0篇
    • 评论:24条
    最新评论
    电子书下载
    数据库参考资料