本文的发布号曾为 CHS167158
在使用 OBJECT标记将 ActiveX 控件嵌入网页中时,用于指定下载位置的 CODEBASE 属性可以指向 .cab 文件。建议使用这种方法打包 MFC ActiveX 控件。在 CAB 文件中打包 MFC ActiveX 控件时,允许控件中包含 .inf 文件以便对 ActiveX 控件的安装进行控制;允许对相关 DLL 进行命名并提供位置;允许代码签名以及自动压缩代码以便更快地进行下载。
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
CODEBASE 指向的 CAB 文件应当包含 .ocx 文件和控制 ActiveX 控件安装的 .inf 文件。在此 CAB 文件中,不应包含系统中已有的相关 DLL(如 MFC DLL)。相反,MFC DLL 和其他相关 DLL 应当包装在单独的 CAB 文件中,并且可以由控件的 .inf 文件引用。以下示例说明如何打包 MFC Spindial 示例控件。
将 Spindial 控件包含到网页中的 OBJECT 标记类似以下内容:
<OBJECTID="Spindial1" WIDTH=200 HEIGHT=200
CLASSID="CLSID:06889605-B8D0-101A-91F1-00608CEAD5B3"
CODEBASE="http://example.microsoft.com/spindial.cab#Version=1,0,0,001">
<PARAMNAME="_Version" VALUE="65536">
<PARAM NAME="_ExtentX"VALUE="2646">
<PARAMNAME="_ExtentY" VALUE="1323">
<PARAMNAME="_StockProps" VALUE="0">
<PARAMNAME="NeedlePosition" VALUE="2">
</OBJECT>
在此示例中,Spindial.cab必须包含两个文件:Spindial.ocx和 Spindial.inf。创建此 CAB 文件的命令类似以下内容(具体取决于 Cabinet 开发工具包的安装路径):
C:\CabDevKit\cabarc.exe N spindial.cab spindial.ocxspindial.inf
以下是有关 MFCSpindial 控件的示例文件 .inf。通过将 Spindial 信息更改为所需的 MFC ActiveX 控件信息,可以修改此 .inf 文件以下载任何 MFC ActiveX 控件。请参见以下注释。
;========================= spindial.inf ========================
; This .inf filewill control the installation of the MFC Spindial
; control. Thiscontrol has been compiled with Visual C++ version 4.2.
; TheFileVersion tags in the dependent DLLs section on this file
; reflect thisrequirement.
[version]
; versionsignature (same for both NT and Win95) do not remove
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
spindial.ocx=spindial.ocx
; These are thenecessary supporting DLLs for MFC 4.2 ActiveX Controls
mfc42.dll=mfc42.dll
msvcrt.dll=msvcrt.dll
olepro32.dll=olepro32.dll
; thiscab is akeyword which, in this case, means that Spindial.ocx
; can be foundin the same .cab file as this .inf file
; file-win32-x86is an x86 platform specific identifier
; See theActiveX SDK - ActiveX Controls - Internet Component Download -
; Packagingcomponent code for automatic download
[spindial.ocx]
file-win32-x86=thiscab
; *** add yourcontrols CLSID here ***
clsid={06889605-B8D0-101A-91F1-00608CEAD5B3}
; Add your ocx'sfile version here.
FileVersion=1,0,0,001
RegisterServer=yes
; dependent DLLs
[msvcrt.dll]
; This is anexample of conditional hook. The hook only gets processed
; if msvcrt.dllof 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 dependentDLLs 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.cabfile actually contains a self extracting executable.
; In this casewe 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 ]
coclassSpindial
可以从控件的版本资源中获得控件的文件版本。当版本资源对任何文件都适用时,可以使用 VisualStudio 打开文件(此例中为Spindial.ocx)版本资源以获得文件版本。从文件菜单中,选择打开,然后单击打开为: 资源。打开 Version 资源;所需的文件版本就在 FILEVERSION 后面列出。
· 所要进行的最后一项更改是,为每个 MFCDLL([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
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
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
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
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
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
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
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 版本进行编译,则您可能不想指定最新的文件版本。这样做可能会导致下载不必要的 MFCDLL。