ActiveX制作cab包学习总结

一,   将ocx文件以及第三方dll文件打包成cab文件

Internet 软件分发单位是“软件包”,它由包含.INF文件或软件分发.OSD文件(或两者都包括)的.CAB文件所组成。一个分发单位也可以包含软件组件,如 ActiveX 控件(.OCX)、.DLL文件、.EXE文件、Java类文件或小程序。当Web页上OBJECT元素的CODEBASE特性引用包含.INF文件的. CAB文件时,Internet Explorer将自动把.CAB文件作为软件分发单位下载并安装,每次访问时还会自动检测版本并进行更新。
INF文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如.DLL或者其它.OCX)。一个.INF文件就捆绑了.CAB压缩文件所有的必须文件。 缺省情况下,与现有硬盘中文件版本号相同的文件不被下载。

1,制作cab包方法一。

a) 先自己写了一个inf文件,其中信息包括将.ocx文件,以及相关的.dll文件打包,并下载到文件夹:\WINDOWS\system32,详细标注如下:
[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%,TestCAB.CAB,1

[Add.Code]
pcpos.ocx=pcpos.ocx
Comm.dll=comm.dll
pcpos.dll=pcpos.dll
TCPCLNT.dll=TCPCLNT.dll

[install.files]
pcpos.ocx=pcpos.ocx
Comm.dll=comm.dll
pcpos.dll=pcpos.dll
TCPCLNT.dll=TCPCLNT.dll

[SourceDisksFiles]
pcpos.ocx=1
Comm.dll=1
pcpos.dll=1
TCPCLNT.dll=1

[pcpos.ocx]
file-win32-x86=thiscab   
RegisterServer=yes   
clsid={719A1D6E-7099-4123-9D63-F0118AFF2D61}   
DestDir=11   
FileVersion=1,0,0,1

[Comm.dll]
file-win32-x86=thiscab   
RegisterServer=yes                        
DestDir=11   
FileVersion=1,0,0,1

[pcpos.dll]
file-win32-x86=thiscab   
RegisterServer=yes     
DestDir=11   
FileVersion=1,0,0,1

[TCPCLNT.dll]
file-win32-x86=thiscab   
RegisterServer=yes     
DestDir=11   
FileVersion=1,0,0,1

[RegisterFiles]   
%11%\pcpos.ocx

注释:
"thiscab"
是一个关键字,意指包含该INF的CAB文件。也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,如:
file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
关键字"file-win32-x86" 指定平台是 x86。
文件版本号可见属性。
"DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/ /SYSTEM32;
"clsid" 指的是要安装控件的CLSID。

b) 制作cab
使用\WINDOWS\system32\iexpress.exe。
1)选择“Create new Self Extraction Directive file”,点击下一步。
2)选择“Create compressed files only(ActiveX Installs)”,点击下一步。
3)点击Add,文件添加(pcpos.ocx,pcpos.dll,comm.dll,tcpclnt.dll),点击下一步。
4)点击Browse,输入.CAB文件的存放地址(包含所取文件名),这里取TestCAB.CAB,并且要选中 “Store files using LongFile Name inside Package”。点击下一步。
5)选择“Don’t save”,一直点击下一步,直到完成。

注意:
如果控件已经在客户机注册,并且不是通过.CAB的方式注册,那么通过.CAB自动注册的时候,该控件将无法被更新。必须先手动删除该文件。

c) 对CAB文件进行数字签名
传说中数字签名之后就可以不出现提示而自动下载,所以也试试:
在\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin 中间有三个小工具,就用他们来实现数字签名。
1.Makecert.exe ---证书创建工具
2.Cert2Spc.exe ---发行者证书测试工具
3.Signcode.exe ---文件签名工具

步骤:
1)makecert -ss name -n "CN=
公司名" -svd:\pos.pvk -r d:\pos.cer 其中sk-表示主题的密钥容器位置,ss-主题的证书存储名称, n-证书颁发对象,r-证书存储位置,-sv 导出私钥文件(为了签名使用)。注意:这个时候会让输入三次密码,三次要完全一致。
2)使用Cert2Spc生成spc发行者证书(可选):cert2spc d:\pos.cer c:\pos.spc
3)双击signcode,不带参数会启动签名向导。先选择要签名文件,下一步,选择“自定义”,下一步,选择“从文件选择”,添加刚生成的pos.cer证书,下一步,选择刚生成的私钥pos.pvk,再下一步,可用spc证书,再一直下一步直至完成。(注意在散列算法中应该选择md5算法)

这样就对CAB文件进行了签名,但是这个时候点击这个文件会发现证书不可用,原因是证书没有安转。文件属性->数字证书->详细信息-〉查看证书-〉安装证书,进入安装证书向导,存放区域选择“受信任的根证书颁发机构”,点击完成即可。

在客户端测试:
1)
加入证书,浏览器-〉工具-〉Internet选项-〉内容-〉证书-〉受信任的颁发机构-〉导入证书。
2)在有证书的情况下,如果服务器没有加入“可信任网址”,提示下载的时候会显示证书所签内容,没有证书则提示为“未知”。
3)如果服务器已加入“可信任网址”,并且已导入证书,则不提示任何信息,在用户毫无感觉情况下下载。如果没有加入“可信任网址“,控件可以正常下载但仍然不能正常使用,与是否签名无关。

2,制作cab包方法二。

a) 需要使用微软如下工具:

1. Makecert.exe---证书创建工具

2. Cert2Spc.exe---发行者证书测试工具

3. Signcode.exe---文件签名工具

b) 单击"开始"-->"运行(R)"-->输入"cmd"-->回车-->进入到操作的控件所在的目录(需要将上面所说的工具,和ocx控件放到一个文件夹下);

c) 制作inf文件,同方法一中inf文件的制作。

d) 将inf和dll打包成cab:

命令行输入cabarc  n  test.cab test.inf  test.ocx这样就将其打包成test.cab

e) 生成cert证书,为得到签名用的spc格式
    命令行输入makecert /sv "test.pvk" /n "cn=test" test.cer
 执行过程中会要求输入密码,密码要一致

f) 生成.spc文件

命令行输入cert2spc test.cer test.spc之后,就在其目录中多了一个test.spc文件

g) 对cab包进行签名

双击signcode,不带参数会启动签名向导。先选择要签名文件,下一步,选择“自定义”,下一步,选择“从文件选择”,添加刚生成的pos.cer证书,下一步,选择刚生成的私钥pos.pvk,再下一步,可用spc证书,再一直下一步直至完成。(注意在散列算法中应该选择md5算法)

二,    遇到的问题

1,制作的cab包在本地静态加载没有问题,但在tomcat上无法加载。而且根本不加提示。

2,下载好的cab文件在system32中能够看到,但是页面仍然不能显示,一把红叉,并且无法使用。

三,    解决方法

1,路径不对。

在jsp中代码为:
<OBJECT id=XXX codebase="XXX.CAB#version=1,0,0,1"height=100 width=100classid="CLSID:719A1D6E-7099-4123-9D63-F0118AFF2D61"VIEWASTEXT></OBJECT>
XXX.CAB
文件应该放置在tomcat5.5安装目录Tomcat 5.5\webapps下该调用jsp所在的工程下。

cab包最好要和html页面在同一个目录下。

2,安全级别问题。

在Internet选项-〉安全-〉受信任的站点-〉站点中添加服务器地址。注意:不要选复选框“对该区域中的所有站点要求服务器验证”。

在Internet选项-〉安全-〉自定义级别 中将所有与ActiveX有关的选项均选为启用或者提示。

3,代码错误。

检查如下三点,看代码是否有错。

a)  'XXX.cab#version=1.0.0.0'这里的引号是否正确(单引号)。

b)  version=1.0.0.0中应使用逗号而不是冒号,即version=1,0,0,0

c)  XXX.cab应该是XXX.CAB,因为你的控件是.CAB的。大小写有关,如果是小写浏览器不会弹出。

四,Inf文件总结
a) INF的功能
1 复制文件、删除文件、或重新命名文件。
2 新增或删除注册表(Registry)中的项目。
3 修改重要的系统设置文件(如 Autoexec.bat、Config.sys、.INI 等)
b) INF的规则
INF是纯文本文件,它是分节的,这点和INI文件类似,每节以"[]"扩起来,每一个节名最长为255个字符(Windows 2000/XP/2003操作系统中)或28个字符(Windows 98操作系统中)。在节与节之间的内容叫条目,每一个节又是由许多的条目组成的,每一个条目都由=分开,如a="b"。如果每一个条目的等号后有多个值,则每一个值之间用","号分隔开。INF对大小写不敏感,行注释语句命令是";",类似VB里的'。如果一行写不下,使用"\"来换行。
c) INF的运行
.INF文件是由Windows的SetupAPI解释执行的脚本文件,它的运行过程很简单,是一种线性的执行,线性的意思就是.INF文件的运行过程不存在分支语句,也就是没有条件语句,一旦开始执行,就是沿着固定的路线运行。它的运行是按照节为单位来执行的,从某一个[Install]节开始执行,从上到下执行该节中的条目,如果该条目是一个节,那么就一条条执行子节中的条目,如此递归执行。在WINDOW上运行只要右击这个文件,点击安装即可。
d) INF的语法结构
[VERSION]指定版本和签名节
系统根据Signuture看是不是适合当前版本,如果适合的话就执行,否则不执行,当然强制安装是可以的

指定安装文件布局,该行是可选的,如果没有提供布局信息文件,则在INF文件内必须包含[SourceDisksNames]和[SourceDisksFiles]节
LayoutFile=filename.inf

[SourceDisksNames]
[SourceDisksNames]节罗列源文件所在盘符序列码、盘描述符、盘卷标号和盘序列号。

[SourceDisksNames]节内语句的语法为:

disk-ordinal=“disk-description”,disk-label,disk-serial-number
其中disk-ordinal为必选项,是盘符序列码,标识一个源盘,具有惟一性,一般可设置为从1开始递增的整数,0不是一个有效的盘符序列码。当存在多个源盘时,盘符序列码之间不能重复。

disk-description为必选项,是盘描述符,用双引号括起的字符串或字符串宏描述盘的内容或目的。安装引擎将该字符串显示在对话框内以提示用户。

disk-label为源盘的卷标识。

disk-serial-number未使用,但必须被设置为0。

[SourceDisksFiles]节

[SourceDisksFiles]节指定安装时使用的源文件和盘符序列码、盘描述符。

[SourceDisksFiles]节内语句的语法为:
file-name=disk-number[,subdir] [,file-size]
其中file-name为必选项,是源盘上文件的名称。

disk-number是包含file-name指定文件所在源盘的盘符序列码,该盘符序列码需在[SourceDisksNames]节中列出,并大于或等于1。

Subdir为可选项,指定文件所在源盘的子目录,如省略则源盘为缺省安装路径。

file-size为可选项,表明文件的大小,以字节为单位。

[DestinationDirs]
指定CopyFiles、RenFiles或DelFiles入口的缺省操作目录
语法file-list-section=LDID,[Subdir]
LDID列表如下
:
01 ;current directory
04 ;backup directory
10 ;windows directory
11 ;system dir
12 ;iosubsys
13 ;command
14 ;control panel directory
15 ;printers directory
16 ;workgrou dir
17 ;inf dir
18 ;help dir
19 ;administration dir
20 ;fonts
21 ;viewers
22 ;vmm32
23 ;color dir
25 ;shared dir
26 ;winboot
28 ;host winboot
30 ;root of boot drive
31 ;root of host drive of a virtual boot drive
32 ;old windows dir if exists

[Install]节提供了一个INF文件安装过程的总览,它识别文件内其他包含安装信息节的详细动作,是Windows内建安装函数识别安装过程和内容的真正入口[Install]

[Install]节分[DefaultInstall]和[OtherInstall]两类
[DefaultInstall]节节名DefaultInstall如前面表格内容所述被显式地在注册表中指定。
该节也是系统获取INF文件中安装信息的首要入口,当用户右击INF文件选“安装”时该节内容被执行。
[OtherInstall]与[DefaultInstall]节遵循相同的语法,但必须被显式地调用,常被用来定义反安装动作
缺省安装节
[DefaultInstall]

指明添加注册表的子节,等号后面的为自定义节名,例子见[add]节ADDREG=add
指明要删除的注册表子节,等号后面的为自定义节名
DELREG=del
指明要要复制的文件子节,用于安装,Copyfiles命令可以替换系统正在访问的文件。这些功能通过普通的del和copy命令都无法实现
CopyFiles=cfile
指明要要删除的文件子节,用于反安装,多个节以逗号隔开,该命令如果发现要删除的文件被锁定,就会把文件放到系统删除队列中排队

等系统重启动的时候,该文件就自动被删除了
DelFiles=删除文件段
[删除文件段]
文件名列表

例子:
a.exe
b.sys

重命名文件段
RenFiles=重命名文件段

[重命名文件段]
语法
:
[file-list-section]
new-file-name,old-file-name
file1,file2 ;修改文件名file1为
file2
更新INI文件段内容子节

UpdateInis = 更新INI文件段

[更新INI文件段]
ini-file, ini-section, [old-ini-entry], [new-ini-entry], [flags]
ini-file 包含要更改条目的 .ini 文件名

ini-section 包含要更改条目的节名
old-ini-entry 可选,常用形式为 Key=Value
new-ini-entry 可选,常用形式为

Key=Value。flags 是可选操作标记

例子
%01%\wincmd.ini, Configuration,,"InstallDir=%01%"
%01%\wincmd.ini,Configuration,,"Mainmenu=%01%\LANGUAGE\TCExtMenu.mnu"

更新ini文件值内容
updateinifield = ini文件更新注册表
ini2reg=aa.ini

更新config.sys内容
updatecfgsys=更新autoexec.bat段

[更新autoexec.bat段]

更新autoexec.bat内容
updateautobat=更新autoexec.bat段
[更新autoexec.bat段]
定义资源节,像资源文件,调用时使用%REG_SZ%就代表了
0x00000000
[Strings]
REG_SZ=0x00000000
REG_BINARY=0x00000001
REG_DWORD=0x00010001

自定义添加注册表项的节[add]

注意格式:HKEY(根键缩写),Subkey(子键),Valuename(键值名),Type(键值类型),Value(键值)

五,   ActiveX编写步骤

1, 启动VC6选择MFC ActiveX ControlWizard创建一个MFC类型的ActiveX控件。

2, 在XXXCtrl.h文件中添加需要调用dll中函数的定义。定义方式如下:

typedef BOOL (WINAPI*lpDrawArea)(RECT, long, int);

3, 使用ClassWizard添加对外提供的方法。

4, 在XXXCtrl.cpp中对应方法的实现函数中调用dll中函数,调用方式如下:

lpDrawArea DrawArea =(lpDrawArea)GetProcAddress(m_hInst, "DrawArea");

if(!DrawArea)

               {

                      dbgprint("GetProcAddress DrawAreafailed");

                      return;

               }

if(!(*DrawArea)(g_rectMotionDetectSet[g_iDetectIndex-1], m_lAreaType, g_iDetectIndex))

        {

               dbgprint("DrawArea failed");

               return;

        }

5, 编写MFC类型的dll时应该在.def文件中指明要导出的函数

6, 在头文件中以成员函数的方式将需要的函数添加到生成的App类中

7, 在cpp文件中的App类的构造函数上定义要导出的函数,定义方式如下:

BOOL WINAPI  DrawArea(RECT HideAlarmSetArea, longlAreaType, int AreaIndex)

{

  returntheApp.HKDrawArea(HideAlarmSetArea, lAreaType, AreaIndex);

}

8, 在cpp文件中的App类的构造函数下面添加导出函数的具体实现。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值