Posted on 2006-02-10 12:08
Raistlin 阅读(980)
评论(1) 编辑 收藏 引用 所属分类:
C++ 、
gear
啥时候也轮到俺写补丁程序了。虽然网络如此发达的今天,实在应该使用在线升级比较好。但微软不是还提供补丁程序下载吗...
nsis的脚本不熟,installshield是庞然大物而且似乎产生的垃圾比实际安装的要多..-_-!
所以自己弄个可以自己定制生成补丁的程序
其实没那么玄,用微软的cabsdk和vc自身的编译功能就可以了
功能:
压缩源文件
解压文件
替换文件或新建文件或删除文件
若失败恢复原系统文件
登记/判断补丁信息
方法:
1、使用cabsdk来生成cab文件 cabsdk可从微软网站上下载
2、建立工程A,功能如下:
(a)设置补丁程序信息
(b)指定补丁源文件和将被替换(或添加)的文件路径
(c)生成配置信息文件patch.ini
(d)调用cabsdk中CABARC.EXE压缩补丁文件和配置信息文件到cab文件
(e)修改工程B的rc文件,把cab文件作为工程B的资源,设置生成的exe文件的描述信息
(f)调用vc编译器NMAKE.exe编译链接工程B
3、建立工程B,功能如下:
(a)调用cabsdk中fdi解压资源中的cab文件到临时文件夹
(b)读取cab文件中的patch.ini
(c)判断补丁是否有效
(d)根据patch.ini信息循环: 备份目标文件,更新文件
(e)失败:恢复原有文件
(f)成功:注册补丁信息,如写入注册表
(g)删除临时文件
即将添加新功能:修改注册表...
未完待修改...
-------------------------------------------传说中的分割线-------------------------------------------
您肯定被上面的搞晕了吧。。没关系,因为还有更好的方式可以实现这个目的,即不需要调用外部的程序直接生成补丁程序。
这就需要:
1直接压缩文件。通过调用FCI的函数可以实现
2直接修改补丁程序的资源。这个难了点,不过俺有秘密武器:)。
不管如何实现的,补丁的数据格式需要预先定义。
补丁的信息和内容保存在补丁程序的资源中。文件名为Patch.cab
Patch.cab
-Patch.ini
-source files
Patch.ini内容如下
patchName=xxx
disusedPatchs=xxx;xxx;xxx
appTitle=xxxx
appDescription=xxx
appComments=xxx
pathVars=path1,path2,path3,path4
path1.type=FIXED
path1.value=xxx
path2.type=ENVIRONMENT
path2.value=%systemenvirement%
path2.alterValue=xxx
path3.type=REGISTER
path3.value=HKEY_LOCALMACHINE|regpath
path3.alterValue=xxx
path4.type=USERINPUT
path4.value=*path3*
filesUpdate=ufile1;ufile2;ufile3...
ufile1.src=....
ufile1.dest=*path1*\relativepath
ufile2.src=...
ufile2=absolutepath
ufile3.src=...
ufile3=...
filesAdd=afile1;afile2..
afile1.src=...
afile1.dest=dest path..
afile2.src=...
afile2.dest=...
filesDelete=dfile1;dfile2..
dfile1=path..
dfile2=path..
regUpdate=ureg1;ureg2...
ureg1.type=BINARY/DWORD/SZ
ureg1.parent=HKEK_LOCAL_MACHINE/HKEY_CURRENT_USER
ureg1.keyname=...
ureg1.keyvalue=...
regAdd=areg1;areg2..
areg1.type=BINARY/DWORD/SZ
areg1.parent=HKEK_LOCAL_MACHINE/HKEY_CURRENT_USER
areg1.keyname=...
areg1.keyvalue=...
regDelete=dreg1;dreg2...
dreg1.parent=HKEK_LOCAL_MACHINE/HKEY_CURRENT_USER
dreg1.keyname=...
-------------------------------------------暗淡的分割线-------------------------------------------
发现要能生成适合各种情况的能订制的补丁要考虑的东西太多太多了...自己要定义一套东西...
相当于制作安装程序要考虑的内容...
那何必呢...直接研究NSIS不就可以了...
NSIS帮助文档的翻译:http://foobar.nease.net/nsis/index.html,和英文的没啥差别,差别就是语言不同.哈
稍微看了一下,又倒了胃口...
本来安装程序这东西就很复杂,提供定制更麻烦,InstallShield不就有无数个变量吗...
-------------------------------------------最后的分割线-------------------------------------------
最终还是用NSIS来做了...
其实NSIS晦涩的地方在于:
1,没有丰富的中文资料,Document上那点内容看了不会让人放心,说实在还是得去他们论坛查,够麻烦
2,很多语法类似于汇编语言
3, contrib目录下有很多库,每个库有各自的文档,而且是不怎么详细的文档
不过便利的地方也很多:
写个.ini文件就可以订制对话框
可以调用外部DLL
支持回调函数(CALLBACK)
可以编写NSIS自己的DLL,直接访问安装程序内部数据
下图是是调用了外部DLL执行mssql的.sql文件,并由外部DLL回调内部方法输出SQL语句的例子。
![nsispatch.jpg](/images/cnitblog_com/raistlin/nsispatch.jpg)