在使用 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。