用 VB 将第三方控件打成 CAB 包(在 WEB 页面上使用)
由于工作的需要,笔者需要在 WEB 页面上显示 CAD 文件(在客户机器上不装 CAD )。由于时间紧迫,现写控件根本来不及,没办法在网上搜寻了一圈。找到了一个软件,大小大概有 8 兆左右。可以用来浏览 DWG 类型的文件。用了一下,发现其用的是一个 DLL 类型的控件,并带有两个附属的 DLL 文件。
如果要在 WEB 页面上使用控件,则控件需要打成 CAB 类型的包。上网找了一个打 CAB 包的工具,名字叫 IExpress 。不过如果用这个工具打包需要手工编写 INF 文件, INF 文件的结构比较复杂,手工编写容易出现错误。想了一下,觉得 VB 自带的打包工具可以制作 CAB 文件包。不过 VB 的打包工具开始必须选择一个 VB 的工程。所以用 VB 建了一个跟控件名称一样的工程,编译了一下,然后用 VB 自带的工具进行打包,打包的类型选择 Internet 类型的安装包。到选择文件这一步的时候,要将多余的文件去掉,因为这个第三方控件不是 VB 编写的,所以根本不用带 VB 的运行库。将第三方控件的主控件 DLL 和两个附属的 DLL 都加到包中,然后开始打包。
包打完之后写了个测试页,在本机上试了一下没有问题(因为本机已经安装了控件),所以在其他的机器上测试了一下,不能正常安装控件,页面上显示一个红叉。查看 IE 临时文件夹下的控件安装日志文件,内容显示控件不能正常注册。到网上查找了一些资料,没有找到原因。后来用 VC 自带的 Dependency Walker 工具查看了一下控件的 DLL ,发现里边还包含了另外三个 DLL ,分别为: msvcr71.dll 、 msvcp71.dll 、 mfc71.dll 。将这三个文件也加进了包里,测试之后,一切正常。
在 WEB 页面上使用控件的脚本如下:
1<html>
2<head>
3<title>BravaACX.CAB</title>
4</head>
5<body>
6<!-- 如果这页上的任何控件需要授权,您必须
7
8创建一个授权包文件。 运行 LPK_TOOL.EXE 来创建
9
10要求的 LPK 文件。 LPK_TOOL.EXE 将从 ActiveX SDK 中找到,
11
12http://www.microsoft.com/intdev/sdk/sdk.htm. 如果您有 Visual
13
14Basic 6.0 CD, 您可以在 \Tools\LPK_TOOL 目录下找到它。
15
16下面是对象标记的例子:
17
18<OBJECT CLASSID="clsid:5220cb21-c88d-11cf-b347-00aa00a28331">
19
20<PARAM NAME="LPKPath" VALUE="LPKfilename.LPK">
21
22</OBJECT>
23
24\-->
25<object classid="CLSID:1BE73243-A85F-4385-939D-14D4845A286A" codebase="BravaACX.CAB#version=5,1,0,5" height="60%" id="ctlBravaACXView" width="60%">
26<param name="Filename" value="db_samp.dwg"/>
27</object>
28</body>
29</html>
打包 CAB 控件的 INF 文件内容为:
;BravaACX.OCX 的 INF 文件
;DestDir 可以为 10 则在 Windows 目录,为 11 则在 Windows\System(32) 目录,或为空则在 Occache 目录。
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[DefaultInstall]
CopyFiles=install.files
RegisterOCXs=RegisterFiles
[RInstallApplicationFiles]
CopyFiles=install.files
RegisterOCXs=RegisterFiles
[DestinationDirs]
install.files=11
[SourceDisksNames]
1=%DiskName%,BravaACX.CAB,1
[Add.Code]
BravaACX.dll=BravaACX.dll
Autorec.dll=Autorec.dll
BACXView.ini=BACXView.ini
Dwg2DL.dll=Dwg2DL.dll
myrdrv.ini=myrdrv.ini
MFC71.dll=MFC71.dll
msvcr71.dll=msvcr71.dll
msvcp71.dll=msvcp71.dll
[install.files]
BravaACX.dll=BravaACX.dll
Autorec.dll=Autorec.dll
BACXView.ini=BACXView.ini
Dwg2DL.dll=Dwg2DL.dll
myrdrv.ini=myrdrv.ini
MFC71.dll=MFC71.dll
msvcr71.dll=msvcr71.dll
msvcp71.dll=msvcp71.dll
[SourceDisksFiles]
BravaACX.dll=1
Autorec.dll=1
BACXView.ini=1
Dwg2DL.dll=1
myrdrv.ini=1
MFC71.dll=1
msvcr71.dll=1
msvcp71.dll=1
[BravaACX.dll]
file-win32-x86=thiscab
RegisterServer=yes
clsid={1BE73243-A85F-4385-939D-14D4845A286A}
DestDir=11
FileVersion=5,1,0,5
[Autorec.dll]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=1,3,0,43
[BACXView.ini]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=0,0,0,0
[Dwg2DL.dll]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=1,3,0,47
[myrdrv.ini]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=0,0,0,0
[MFC71.dll]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=7,10,3077,0
[msvcr71.dll]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=7,10,3052,4
[msvcp71.dll]
file-win32-x86=thiscab
RegisterServer=no
DestDir=11
FileVersion=7,10,3077,0
[RegisterFiles]
%11%\BravaACX.dll
作者:崔占民
EMAIL : [email protected]