`
marlboro027
  • 浏览: 54229 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

【转】制作cab包的方法

    博客分类:
  • ocx
阅读更多
解决方案:
    这种自动下载功能,是Internet Explorer的5.X以上版本提供的一种基于Active X的方式。IE浏览器会通过网页里面的<object>标签所标示的软件名称以及版本,检测当前系统中是否装有该软件,若装了,则检测版本是否比它老,当当前系统中没有该软件或者版本不够新时,IE就会自动安装该软件,当然在安装软件之前,它会有一个安全认证的过程。

实现步骤:

1.选择文件
    要安装的插件或者程序必然是有一个或者多个文件组成的,它可以是.exe可执行文件,也可以是.ocx、.dll等类型的文件。首先我们要安装的文件准备好,最好存放在同一目录内,以便下一步的制作。我在这里选定了个文件做演示,test.dll,准备安装到当前windows的系统目录。

2.制作.inf文件。
    .inf文件也就是安装配置文件。它指定了软件包内需要安装的文件和这些需要安装的目标目录,需要创建的程序组以及需要改动的注册表内容。绝大部分的安装程序都包含这类文件。
    普通的.inf文件一般分为几节。见表1
[Version]               用于确认.inf文件的基本版本信息
[DefaultInstall]       默认情况下,会执行的一节。包含指向其他节的指针,该节可用于指定要复制和删除的文件、注册表的更新、.inf文件的更新等。
[DestinationDirs]   指定硬盘上复制、删除或重命名节文件的位置(列如\windows或windows\system)。
[fileCopy/Delete/RenameSection(s)] 列出要复制、删除或重命名的文件。
[Strings]              列出上面所使用的可本地化字符串。

表1

需要重点说明的就是目标文件夹“DestinationDirs”一节,我们一般使用逻辑磁盘标示符(LDID),其中25表示system目录,其他见表2
00 Null LDID-可用于创建新的LDID
01 Source Drive:\pathname
10 Machine文件夹(在基于服务器的安装时,映射windows文件夹)
11 System文件夹
12 IOSubsys文件夹
13 Command文件夹
17 Inffolder
18 Help文件夹
20 Fonts
21 Viewers
22 VMM32
23 Color文件夹
24 包含windows文件夹的驱动器根目录
25 windows文件夹
26 windows的约定引导设备(Winboot)
28 Host Winboo
30 启动盘的根文件夹
31 虚拟启动盘的主驱动器根文件夹

表2

3.制作软件包
    我们要将插件或者软件最终在网页上发布,还必须将它做成windows的.cab压缩软件包。制作该软件包的工具IExpress在高版本的 windows里面已经提供,如果windows版本不够高,可以在IE5安装程序中查找IEAK5.EXE或者IEAK5CD.EXE,执行该文件即可。
运行Iexpress程序,选择Create Compressed files only(Active Installs),这样制作出的即是.cab文件。接下来是软件包的命名,我们不妨命名为test.cab文件。然后再选取test.dll、 test.inf两个文件进行打包。

4.进行数字签名
    虽然我们做好了软件包,但是如果不用电子证书对他进行数字签名的话,它是不能通过客户端的安全检查的(除非安全级别设成“低”)。可使用signcode.exe,下载地址download/signcode.exe。

5.在网页上发布软件包
    我们的终极目的当然是要在网页上发布该软件或插件。需要使用的HTML元素是:<object></object>

先将我们的操作中涉及的它的属性介绍如下:
clsid:生成的类在windows中的编号,这里涉及部分windows注册表知识,本文不再赘述。
codebase:指定需要下载的软件地址及其版本。
比如我们可以在网页中写入:

<object classid="clsid:A27CDB6E-AE6D-11CF-96B8-444553540000" codebase="test.cab#Version=1,0,0,0" VIEWASTEXT>
</object>

这里要提示大家的是,如果你并不清楚自己的软件应该设置成什么版本的时候,可以写上Version=-1,-1,-1,-1,这样就可以达到如果客户端没有该软件就下载,倘若下载过就忽略的目的。
最后,我们要做的就是体验自己的成果了。







制作cab安装包是一件挺简单的事情,如果大家写的主题或者程序 涉及到注册表的修改,建议使用cab安装包来进行安装。
首先你需要如下几个文件 ,CabwizSP.exe ,cabwiz.ddf。
好了,下面进入正文,要制作.cab安装包,你只要写一个.inf文件,CabwizSP.exe会根据你的这个INF文件来生成_setup.xml ,那么文件要如何写呢?其实很简单,我会提供一个范本,大家只要修改[SourceDisksFiles]之后的字段即可。
下面我就来解释一下主要字段的含义。
第一个字段[Version]中Provider大家可以随便改,其他两个参数就不要去碰了。
第二个字段[CEStings]的AppName=""就是你为所要安装的程序所起的名字。完整的名字将会是Provider参数的字符 串加上AppName参数的字符串,例如范本,最后出现在删除程序中的名字就是“MGCN iMac”。
第三个字段[CEDevice.ARM720],CEDevice字段是程序所对应的设备平台 ,这个大家就不用去管它了,写smartphone的inf文件时候加上这个字段就行了。
下面的[SourceDisksNames]是指定源文件所在的磁盘和路径,这里我也搞不太清楚,sdk中的例子 也看不懂,我用绝对路径也不行,索性就直接用.代替,反正大家copy就是了(看补充1),这样,大家只要把要打包的文件要和inf放在一起就可以了。
下面一个字段[SourceDisksFiles]就是大家要打包的文件清单,后面的=1就表示文件的路径,也就是[SourceDisksNames]中的 1。再下一个字段[DefaultInstall]就是安装步骤,范本中CopyFiles参数和AddReg参数表示安装不仅仅是解压拷贝文件,还要修改注册表。CopyFiles=后面跟着是字段名字,即你所要做的拷贝工作到底有哪些。AddReg=作用一样。例如在范本中,CopyFiles=CopyToHomeDir,CopyToiMacDir就是告诉CabwizSP.exe要做两个拷贝文件工作,第一个是把一些文件拷贝到Home文件夹下,要拷贝的文件在[CopyToHomeDir]字段中,第二个是把一些文件拷贝到iMac文件夹下,要拷贝的文件在 [CopyToiMacDir]而AddReg=RegData表示安装程序还要修改注册表,修改的东西在[RegData]字段中。下一个字段就是目标文件夹的具体位置。两个参数CopyToHomeDir和CopyToiMacDir要和上个字段的CopyFiles等号右边的两个字符串值分别相同。这里0我也不清楚是什么意思,sdk中找不到,%CE19%就表示\Storage\Application Data(看最后注释)
再下一个字段[CopyToHomeDir]就是具体的任务分配了,引号里面表示解压后的文件名,必须和你压缩前的文件名相同,即必须在 [SourceDisksFiles]中能找到相应的文件,后面表示拷贝到相应目录后的文件名,如果没特殊要求就不要改名了。后面一个字段作用和这个相同,我就不多说了,最后是修改注册表段,第一个“,”之前表示注册表中的四大块的名字,直接用缩写就可以了,如范本中HKLM就代表 HKEY_LOCAL_MACHINE,其他三个分别为HKCR,HKCU和HKU。第二个“,”之前表示你要修改的键的具体路径(如果没有会自动 建立),即完整的项(key)名称,第三个“,”之前就表示你要具体修改的键(就是我们经常在修改注册表的文章中看到的Value Name),如果没有的话程序就会自动建立,第四个“,”之前表示值类型,目前我只懂得整数是0x00010001(见补充2),字符型数据 这里你就不要填了,留着个“,”就可以了。最后就是你要填入的Value。
例如在范例中HKLM,SOFTWARE\Microsoft\Shell\Rai\:CallAlert,BKBitmapFile,,"\Storage\Application Data\Home\iMac\call1.jpg" 表示修改(建立)名为BKBitmapFile的键的值,它在HKLM\SOFTWARE\Microsoft\Shell\Rai \:CallAlert下,值内容为\Storage\Application Data\Home\iMac\call1.jpg,很明显,这是一个值为String类型的键。整数的我就不说了,范本中有,我相信大家看得懂。
好了,inf文件写好了,copy你要打包的文件和inf文件到含有CabwizSP.exe,cabwiz.ddf的目录中,在命令行模式 下输入CabwizSP xx.inf,xx代表你为inf文件起的名字,那么一个带_setup.xml的.cab包就生成完毕了,安装一下,看看自己的成果吧。

注释:%A%表示引用A参数的值,如CopyToHomeDir = 1,%CE1%\%AppName%的话就代表\storage\program files\MGCN iMac。(在范例中AppName=Provider+AppName="MGCN"+"iMac"),而对于%CEX%,系统 在安装程序时候会自动翻译,如%CE19%翻译结果是\Application Data,又如CE1表示\program files,CE2表示\windows , 最后的翻译结果系统会在前面已翻译的结果上再加上默认的storage卷标名(前提是存在默认的storage卷标名),如Smartphone的默认磁盘卷标是Storage,那么%CE19%最终就变成了\Storage\Application Data。有兴趣的可以去翻翻SDK 看看到底有多少的%CEX%。
补充1:从modaco的那篇英文文章知道,[SourceDisksNames]包含有四个域,域与域之间用逗号隔开,第一个域是disk_id,磁盘的id(我什么都试过了,这个实在不懂啥意思...大家就表管它意义了。),第二个域是注释,要用""把注释内容包含起来,第三个不知道,第四个是文件路径,“.”就表示当前目录,“..”表示当前目录的上一级目录。
补充2:第四个","之前0x00010001称之为Flag,应该说是对后面value具体类型的表明。几个flag说明如下:
0x00000002 如果注册的键(值)存在,则不修改它,不存在的话值就等于最后一个域的内容了(废话...)这个flag可以和下面的任何flag混用(具体怎么混用我也不懂,如果你用这个Flag的话,后面所跟的内容就是string类型了,按理说可以指定后面内容的类型的,不过我试不出来,sdk中也找不到相关说明,估计要去msdn中去找才行...)
0x00000000 表明是String类型,对应注册表中的REG_SZ数据类型。
0x00010000 表明是Multi-String类型,对应REG_MULTI_SZ数据类型。就是说包含有很多个字符串,每个字符串用“,”隔开。 HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSClog,BKFlags,0x00010000,"xxx","yyy","zzz"
0x00000001 二进制类型,对应注册表中的REG_BINARY数据类型,你可以写好几个不同的的二进制,每个二进制数就代表一个域,域与域之间用","隔开,注意不能用0x打头(16进制的头标志)。格式如下:HKLM,SOFTWARE\Microsoft\Shell\Rai \:MSClog,BKFlags,0x00000001,00,01,11,10,11,10
0x00010001 表示是整数,对应注册表中的REG_DWORD数据类型。如果数字前面加0x表示十六进制数字,写入注册表时会自动翻译成十进制。如:HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSClog,BKFlags,0x00010001,0x26那么生成 _setup.xml时候0x26就变成了38,datatype还是integer。
补充3:[String]字段。这个字段是用来定义 你要重复使用的字符串的缩写的,比如你"Software\Microsoft\My Test App"这个字符串用得很多,你可以用r来代表,只要你在这个字段中写入r = "Software\Microsoft\My Test App" 那么再后面字段中你就可以用%r%来表示Software\Microsoft\My Test App了,例如在注册表字段中你可以这样写HKLM,%r%,test,0x00010001,3,就等同于 HKLM,Software\Microsoft\My Test App,test,0x00010001,3    
补充4:关于建立快捷键。形式如下,主要是要在[DefaultInstall],[DestinationDirs]加入相应的项目,并且要建立一个字段,字段名字可以随便取,不过注意三个字段中这个名字都要一样。如:
[DefaultInstall]
CEShortcuts = Shortcuts
[DestinationDirs]
Shortcuts = 0,%CE14%             
[Shortcuts]
Sample App,0,sample.exe             
Sample App,0,sample.exe,%InstallDir%
这里主要是最后一个字段的语法要说明一下,四个域,域之间用逗号隔开,前三个域的内容必须填写。第一个域是快捷键名称,第二个域中0表示是文件,其他任何非零数表示为目录,第三个域就是快捷键的目标程序(目录),第四个域是可选域,是安放快捷键的目录,默认目录就是[DestinationDirs]中 Shortcuts = "",你可以指定其他目录,如你想在开始菜单 中加入自己的快捷键的话就在这里写上storage\windows\startmenu\。

最后需要说明的是文中的为了方便大家能看清楚,逗号都用全角表示,INF文件涉及系统的东西是不能使用全角符号的,字符串我还没有试过,不过我建议大家能使用英文尽量使用英文....

范本1,我自己写的主题iMac的inf文件
[Version]
Signature  = "$Windows NT$"   
Provider  = "MGCN"   
CESignature = "$Windows CE$"   
[CEStrings]
AppName   = "iMac"   

[CEDevice.ARM720]
ProcessorType = 0
[SourceDisksNames]   
1 =.
[SourceDisksFiles]
imac.home.xml    = 1
alert.jpg    = 1
app.jpg    = 1
batterieoff.bmp    = 1
batterieon.bmp    = 1
BatteryMask.gif    = 1
calendar.jpg    = 1
call1.jpg    = 1
call.jpg    = 1
confirm.jpg    = 1
contacts.jpg    = 1
dial.jpg    = 1
dialback.jpg    = 1
error.jpg    = 1
i1.gif    = 1
i2.gif    = 1
i3.gif    = 1
i4.gif    = 1
incall.jpg    = 1
info.jpg    = 1
kbat.ini    = 1
kdh2.jpg    = 1
newhome.jpg    = 1
pro.jpg    = 1
programs.jpg    = 1
sm.jpg    = 1
volume.jpg    = 1

[DefaultInstall]
CopyFiles  = CopyToHomeDir, CopyToiMacDir
AddReg      = RegData
[DestinationDirs]
CopyToHomeDir = 0,%CE19%\Home
CopyToiMacDir = 0,%CE19%\Home\iMac
[CopyToHomeDir]
"iMac.home.xml",iMac.home.xml
[CopyToiMacDir]
"alert.jpg", alert.jpg
"app.jpg", app.jpg
"batterieoff.bmp", batterieoff.bmp
"batterieon.bmp", batterieon.bmp
"BatteryMask.gif", BatteryMask.gif
"calendar.jpg", calendar.jpg
"call1.jpg", call1.jpg
"call.jpg", call.jpg
"confirm.jpg", confirm.jpg
"contacts.jpg", contacts.jpg
"dial.jpg", dial.jpg
"dialback.jpg", dialback.jpg
"error.jpg", error.jpg
"i1.gif", i1.gif
"i2.gif", i2.gif
"i3.gif", i3.gif
"i4.gif", i4.gif
"incall.jpg", incall.jpg
"info.jpg", info.jpg
"kbat.ini", kbat.ini
"kdh2.jpg", kdh2.jpg
"newhome.jpg", newhome.jpg
"pro.jpg", pro.jpg
"programs.jpg", programs.jpg
"sm.jpg", sm.jpg
"volume.jpg", volume.jpg

[RegData]                          
HKLM,SOFTWARE\Microsoft\Shell\Rai\:CallAlert,BKBitmapFile,,"\Storage\Application Data\Home\iMac\call1.jpg"
HKLM,SOFTWARE\Microsoft\Shell\Rai\:ErrorBox,BKBitmapFile,,"\Storage\Application Data\Home\iMac\error.jpg"
HKLM,SOFTWARE\Microsoft\Shell\Rai\:ExclamationBox,BKBitmapFile,,"\Storage\Application Data\Home\iMac\alert.jpg"
HKLM,SOFTWARE\Microsoft\Shell\Rai\:InformationBox,BKBitmapFile,,"\Storage\Application Data\Home\iMac\info.jpg"
HKLM,Software\Microsoft\Shell\Rai\: QuestionBox,BKBitmapFile,,"\Storage\Application Data\Home\iMac\confirm.jpg"
HKLM,SOFTWARE\Microsoft\Shell\Rai\:VolDlg,BKBitmapFile,,"\Storage\Application Data\Home\iMac\volume.jpg"
HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSStart,BKBitmapFile,,"\Storage\Application Data\Home\iMac\programs.jpg"
HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSCPROG,BannerImage,,"\Storage\Application Data\Home\iMac\incall.jpg"
HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSCPROG,BKBitmapFile,,"\Storage\Application Data\Home\iMac\dialback.jpg"
HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSCdial,BannerImage,,"\Storage\Application Data\Home\iMac\dial.jpg" 
HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSClog,BKBitmapFile,,"\Storage\Application Data\Home\iMac\programs.jpg"
HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSClog,BKFlags,0x00010001,26
HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSCONTACTS,BKBitmapFile,,"\Storage\Application Data\Home\iMac\contacts.jpg"
HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSCONTACTS,BKFlags,0x00010001,26
HKLM,SOFTWARE\Microsoft\Shell\Rai\:MSSYNCAPP,BKBitmapFile,,"\Storage\Application Data\Home\iMacX\programs.jpg"
HKCU,ControlPanel\Home,Scheme,,"\Storage\Application Data\Home\iMac.home.xml"
HKCU,ControlPanel\Home,BgImage,,
HKCU,ControlPanel\Home,ColorScheme,,

范本2,e200插件的inf文件[Version]
Signature = "$Windows NT$"
Provider = "Orange"
CESignature = "$Windows CE$" [CEStrings]
AppName = "E200's plugin"
[CEDevice.ARM720]
ProcessorType = 0[SourceDisksNames]
1 =. [SourceDisksFiles]
4orangeh.dll = 1
[DefaultInstall]
CopyFiles = CopyToHomeDir
AddReg = RegData[DestinationDirs]
CopyToHomeDir = 1,%CE19%\Home[CopyToHomeDir]
"4orangeh.dll",4orangeh.dll
[RegData]
HKCR,CLSID\{A2536C54-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"
HKCR,CLSID\{A2536C55-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"
HKCR,CLSID\{A2536C56-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"
HKCR,CLSID\{A2536C57-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"
HKCR,CLSID\{A2536C58-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"
HKCR,CLSID\{A2536C59-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"
HKCR,CLSID\{A2536C5B-6AC2-4C31-9542-B144B0E9D077}\InprocServer32,,,"\Storage\Application Data\Home\4orangeh.dll"

http://msdn.microsoft.com/en-us/library/aa924371.aspx

http://www.devdiv.net/viewthread.php?tid=1594&extra=page%3D1



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/okadler0518/archive/2009/06/02/4235835.aspx
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics