S.l.e!ep.¢%

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

如何在VC中利用生成控件时生成CAB文件

Posted on 2009-09-01 14:42 S.l.e!ep.¢% 阅读(1208) 评论(0)  编辑 收藏 引用 所属分类: COM

如何在VC中利用生成控件时生成CAB文件

VC不象VB有PDWizard,需要手工生成CAB文件,可以参考“微软的Knowledge Base的文章:“Q167158 WTO: Packaging MFC Controls for Use Over the Internet”。 下面是全文:
 

HOWTO:为通过 Internet 使用的 MFC 控件打包

文章 ID : 167158
最后更新日期 : 2004年1月21日
版本 : 2.0
本文的发布号曾为 CHS167158

概要

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

更多信息

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

例如,CODEBASE 可以直接指向 .ocx 文件(如下所示):
CODEBASE="http://example.microsoft.com/somecontrol.ocx#version=4,70,0,1086"
因为这只下载和安装 .ocx 文件,所以这种解决方法取决于客户机上已有的任何必要的支持 DLL。在多数情况下,不应假设客户端上已有这些 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 Web 站点: CODEBASE 指向的 CAB 文件应当包含 .ocx 文件和用于控制 ActiveX 控件安装的 .inf 文件。在此 CAB 文件中,不应包含系统中已有的相关 DLL(如 MFC DLL)。相反,MFC DLL 和其他相关 DLL 应当包装在单独的 CAB 文件中,并且可以由控件的 .inf 文件引用。以下示例说明如何包装 MFC Spindial 示例控件。

将 Spindial 控件包含到 Web 页中的 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。可以修改此 .inf 文件以下载任何 MFC ActiveX 控件,即将 Spindial 信息更改为所需的 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 和文件版本(FileVersion):
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
可以从控件的版本资源中获得控件的文件版本 (FileVersion)。当版本资源对任何文件都适用时,可以使用 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 和更早版本,使用:

Olepro32.dll   4,1,0,6038
Mfc40.dll      4,1,0,6139
Msvcrt40.dll  4,10,0,6038

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

Olepro32.dll   4.2,0.6068
Mfc42.dll      4,2,0,6256
Msvcrt.dll    4,20,0,6164

VC 5.0,使用:

Olepro32.dll   5.0.4055.1
Mfc42.dll      4.21,0.7022
Msvcrt.dll    5.0,0.7022

VC 5.0sp1,使用:

Olepro32.dll   5.0.4055.1
Mfc42.dll      4.21,0.7160
Msvcrt.dll    5.0,0.7128

VC 5.0sp2,使用:

Olepro32.dll   5.0.4055.1
Mfc42.dll      4.21,0.7160
Msvcrt.dll    5.0,0.7128

VC 5.0sp3,使用:

Olepro32.dll   5.0.4230.1
Mfc42.dll      4.21,0.7303
Msvcrt.dll    5.0,0.7303

VC 6.0,使用:

Olepro32.dll   5.0,0,6038
Mfc42.dll      6.0,0,6256
Msvcrt.dll    6.0.8168.0


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

参考

有关更多信息,请访问下面的 Microsoft Developer Network (MSDN) Web 站点: 有关其他信息,请单击下列文章编号,查看相应的 Microsoft 知识库文章:
264570 INFO:WebCast:How Does Internet Component Download Work?(WebCast:Internet 组件下载是如何实现的?)

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