S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

如何打包网页中的 MFC 控件

Posted on 2009-09-01 16:05 S.l.e!ep.¢% 阅读(769) 评论(0)  编辑 收藏 引用 所属分类: COM
如何打包网页中的 MFC 控件

如何打包网页中的 MFC 控件

本文的发布号曾为 CHS167158

本页

展开全部 | 关闭全部

概要
在使用 OBJECT 标记将 ActiveX 控件嵌入网页中时,用于指定下载位置的 CODEBASE 属性可以指向 .cab 文件。建议使用这种方法打包 MFC...

在使用 OBJECT 标记将 ActiveX 控件嵌入网页中时,用于指定下载位置的 CODEBASE 属性可以指向 .cab 文件。建议使用这种方法打包 MFC ActiveX 控件。在 CAB 文件中打包 MFC ActiveX 控件时,允许控件中包含 .inf 文件以便对 ActiveX 控件的安装进行控制;允许对相关 DLL 进行命名并提供位置;允许代码签名以及自动压缩代码以便更快地进行下载。

更多信息
ActiveX 控件是使用 OBJECT 标记嵌入到网页中的。OBJECT 标记的 CODEBASE 属性指定从中下载控件的位置。CODEBASE 可以成功地指...

ActiveX 控件是使用 OBJECT 标记嵌入到网页中的。OBJECT 标记的 CODEBASE 属性指定从中下载控件的位置。CODEBASE 可以成功地指向一组不同的文件类型。

例如,CODEBASE 可以直接指向 .ocx 文件,如下所示:
CODEBASE="http://example.microsoft.com/somecontrol.ocx#version=4,70,0,1086"
				
因为这将仅下载和安装 .ocx 文件,所以这种解决方案依赖于客户机上已有的任何必要的支持 DLL。在多数情况下,应该假设这些 DLL 不会存在于客户端上,而且不是正确的版本。

另一种可供选择的方法是将 CODEBASE 指向 .inf 文件,例如:
CODEBASE="http://example.microsoft.com/doyoutrustme.inf"
				
.inf 文件控制 .ocx 文件及其支持文件的安装。不推荐使用这种方法,因为这种方法不能对 .inf 文件进行签名(请参见“参考资源”一节以获得有关代码签名的参考资料)。

最佳的解决方案是 CODEBASE 指向 CAB 文件。使用这种方法,可以引用支持 DLL 并对 CAB 文件进行签名。

注意:如果遵循以下引用 MFC DLL 的说明,当客户端上已有 MFC DLL 时,则不对它们进行下载。CODEBASE 行类似如下内容:
CODEBASE="http://example.microsoft.com/acontrol.cab#version=1,2,0,0"
				
注意,其中的 #Version 信息适用于 OBJECT 标记的 CLASSID 参数所指定的控件版本。

Cab 打包概述

在 Cabinet 软件开发工具包(也称为 Cabinet SDK 或 CAB 开发工具包)中,可以找到构造 CAB (.cab) 文件所需的工具。请参见以下 Microsoft 网站:
Microsoft Cabinet SDK
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncabsdk/html/cabdl.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncabsdk/html/cabdl.asp)
CODEBASE 指向的 CAB 文件应当包含 .ocx 文件和控制 ActiveX 控件安装的 .inf 文件。在此 CAB 文件中,不应包含系统中已有的相关 DLL(如 MFC DLL)。相反,MFC DLL 和其他相关 DLL 应当包装在单独的 CAB 文件中,并且可以由控件的 .inf 文件引用。以下示例说明如何打包 MFC Spindial 示例控件。

将 Spindial 控件包含到网页中的 OBJECT 标记类似以下内容:
   <OBJECT ID="Spindial1" WIDTH=200 HEIGHT=200
   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。创建此 CAB 文件的命令类似以下内容(具体取决于 Cabinet 开发工具包的安装路径):
C:\CabDevKit\cabarc.exe N spindial.cab spindial.ocx spindial.inf
				
以下是有关 MFC Spindial 控件的示例文件 .inf。通过将 Spindial 信息更改为所需的 MFC ActiveX 控件信息,可以修改此 .inf 文件以下载任何 MFC ActiveX 控件。请参见以下注释。
   ; ========================= spindial.inf ========================

   ; This .inf file will control the installation of the MFC Spindial
   ; control. This control has been compiled with Visual C++ version 4.2.
   ; The FileVersion tags in the dependent DLLs section on this file
   ; reflect this requirement.

   [version]
   ; version signature (same for both NT and Win95) do not remove
   signature="$CHICAGO$"
   AdvancedINF=2.0

   [Add.Code]
   spindial.ocx=spindial.ocx
   ; These are the necessary supporting DLLs for MFC 4.2 ActiveX Controls
   mfc42.dll=mfc42.dll
   msvcrt.dll=msvcrt.dll
   olepro32.dll=olepro32.dll
   ; thiscab is a keyword which, in this case, means that Spindial.ocx
   ; can be found in the same .cab file as this .inf file
   ; file-win32-x86 is an x86 platform specific identifier
   ; See the ActiveX SDK - ActiveX Controls - Internet Component Download -
   ; Packaging component code for automatic download

   [spindial.ocx]
   file-win32-x86=thiscab
   ; *** add your controls CLSID here ***
   clsid={06889605-B8D0-101A-91F1-00608CEAD5B3}
   ; Add your ocx's file version here.
   FileVersion=1,0,0,001
   RegisterServer=yes

   ; dependent DLLs
   [msvcrt.dll]
   ; This is an example of conditional hook. The hook only gets processed
   ; if msvcrt.dll of the specified version is absent on client machine.
   FileVersion=4,20,0,6164
   hook=mfc42installer

   [mfc42.dll]
   FileVersion=4,2,0,6256
   hook=mfc42installer

   [olepro32.dll]
   FileVersion=4,2,0,6068
   hook=mfc42installer

   [mfc42installer]
   file-win32-x86=VALUE=http://activex.microsoft.com/controls/vc/mfc42.cab
   ; If dependent DLLs are packaged directly into the above cabinet file
   ; along with an .inf file, specify that .inf file to run as follows:
   ;InfFile=mfc42.inf
   ; The mfc42.cab file actually contains a self extracting executable.
   ; In this case we specify a run= command.
   run=%EXTRACT_DIR%\mfc42.exe

   ; ====================== end of spindial.inf =====================
				
根据控件以及创建控件所使用的 MFC 版本,需要对此 .inf 文件的以下部分加以修改:
  • 对 Spindial 的任何引用均应更改为控件的名称。这包括注释和以下内容:
       spindial.ocx=spindial.ocx
       [spindial.ocx]
    					
  • 应该将以下内容更改为控件的正确 CLSID 和文件版本:
       clsid={06889605-B8D0-101A-91F1-00608CEAD5B3}
       FileVersion=1,0,0,001
    						
    可以从上述控件的 ODL 文件中获得控件的 CLSID。CLSID 与控件的 coclass 有关。例如,上述 CLSID 是从 Spindial.odl 的以下部分中获得的:
       [ uuid(06889605-B8D0-101A-91F1-00608CEAD5B3),
    
         helpstring("Spindial Control"), control ]
         coclass Spindial
    						
    可以从控件的版本资源中获得控件的文件版本。当版本资源对任何文件都适用时,可以使用 Visual Studio 打开文件(此例中为 Spindial.ocx)版本资源以获得文件版本。从文件菜单中,选择打开,然后单击打开为: 资源。打开 Version 资源;所需的文件版本就在 FILEVERSION 后面列出。
  • 所要进行的最后一项更改是,为每个 MFC DLL([mfc42.dll]、[olepro32.dll] 和 [mscvrt.dll])输入正确的文件版本。注意,如果使用的是 Visual C++ 4.1 或更早版本,则需要将对 Mfc42.dll 的任何引用更改为 Mfc40.dll,将对 Msvcrt.dll 的任何引用更改为 Msvcrt40.dll。
应使用以下文件版本:

VC 4.1 和更早版本,使用:

http://activex.microsoft.com/controls/vc/mfc40.cab (http://activex.microsoft.com/controls/vc/mfc40.cab)
Olepro32.dll   4,1,0,6038
Mfc40.dll      4,1,0,6139
Msvcrt40.dll  4,10,0,6038
				

VC 4.2b 和更早版本,使用:

http://activex.microsoft.com/controls/vc/mfc42.cab (http://activex.microsoft.com/controls/vc/mfc42.cab)
Olepro32.dll   4,2,0,6068
Mfc42.dll      4,2,0,6256
Msvcrt.dll    4,20,0,6164
				

VC 5.0,使用:

http://activex.microsoft.com/controls/vc/mfc42.cab (http://activex.microsoft.com/controls/vc/mfc42.cab)
Olepro32.dll   5,0,4055,1
Mfc42.dll     4,21,0,7022
Msvcrt.dll     5,0,0,7022
				

VC 5.0sp1,使用:

http://activex.microsoft.com/controls/vc/mfc42.cab (http://activex.microsoft.com/controls/vc/mfc42.cab)
Olepro32.dll   5,0,4055,1
Mfc42.dll     4,21,0,7160
Msvcrt.dll     5,0,0,7128
				

VC 5.0sp2,使用:

http://activex.microsoft.com/controls/vc/mfc42.cab (http://activex.microsoft.com/controls/vc/mfc42.cab)
Olepro32.dll   5,0,4055,1
Mfc42.dll     4,21,0,7160
Msvcrt.dll     5,0,0,7128
				

VC 5.0sp3,使用:

http://activex.microsoft.com/controls/vc/mfc42.cab (http://activex.microsoft.com/controls/vc/mfc42.cab)
Olepro32.dll   5,0,4230,1
Mfc42.dll     4,21,0,7303
Msvcrt.dll     5,0,0,7303
				

VC 6.0,使用:

http://activex.microsoft.com/comtrols/vc/mfc42.cab (http://activex.microsoft.com/controls/vc/mfc42.cab)
Olepro32.dll   5,0,4261,0
Mfc42.dll      6,0,8168,0
Msvcrt.dll     6,0,8168,0
				


注意,4.2 和 6.0 之间的所有 MFC 版本均使用 Mfc42.cab。此 .cab 文件总是包含最新版本的 DLL,因为它们是向后兼容的。如果不使用更高的 MFC 版本进行编译,则您可能不想指定最新的文件版本。这样做可能会导致下载不必要的 MFC DLL。

参考
有关更多信息,请访问下面的 Microsoft Developer Network (MSDN) 网站: 打包 ActiveX 控件http://msdn.mi...

有关更多信息,请访问下面的 Microsoft Developer Network (MSDN) 网站:
打包 ActiveX 控件
http://msdn.microsoft.com/library/default.asp?url=/workshop/components/activex/packaging.asp?frame=true (http://msdn.microsoft.com/library/default.asp?url=/workshop/components/activex/packaging.asp?frame=true)
ActiveX 控件的安全初始化和脚本编写
http://msdn.microsoft.com/library/default.asp?url=/workshop/components/activex/safety.asp?frame=true#iobjsafe (http://msdn.microsoft.com/library/default.asp?url=/workshop/components/activex/safety.asp?frame=true#iobjsafe)
使用 Microsoft Authenticode 技术进行代码签名
http://msdn2.microsoft.com/en-us/library/ms537358.aspx (http://msdn2.microsoft.com/en-us/library/ms537358.aspx)
使用 ActiveX 控件自动完成网页
http://msdn.microsoft.com/library/default.asp?url=/workshop/components/activex/tutorial.asp?frame=true (http://msdn.microsoft.com/library/default.asp?url=/workshop/components/activex/tutorial.asp?frame=true)
有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
264570  (http://support.microsoft.com/kb/264570/ ) INFO:网络广播:Internet 组件下载是如何实现的?

这篇文章中的信息适用于:
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 4.2 专业版
  • Microsoft Visual C++ 5.0 标准版
  • Microsoft Visual C++ 6.0 Service Pack 5
  • Microsoft Internet Explorer 5.5
  • Microsoft Internet Explorer 3.0
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 5.0

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理