分享
 
 
 

解压缩软件在安装制作领域的增值思考

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

引言

解压缩软件不应该固步自封,完全可以扩展到安装制作领域,本文引入触发器的概念,权作抛砖引玉。

一 、触发器

纯粹的解包过程就是把包里的目录和文件还原到指定物理路径中的过程,我们常用的Winzip、WinRAR等解压缩软件就属于这一类。安装过程实际上就是解包过程加上某种配置和控制过程,例如,需要自注册COM组件,需要创建虚拟目录,需要向注册表写信息,需要创建快捷方式等等。触发器就是用来控制和扩展解包过程的插件,通过定制触发器就可以完成大部分的安装配制过程。软件厂商可以提供事先定制好的具有某些功能的触发器,用户只要按指定格式配置就能完成需要的配置和控制操作,同时用户又可以自定义触发器。共有四种类型的触发器:

(1) 解包前

(2) 分解元素前

(3) 分解元素后

(4) 解包后

元素:指文件或目录,包也是一种元素。

分解:指还原。

分解元素:指还原文件或还原目录。

“分解目录后”是指该目录下的所有子目录和文件都被还原结束后。

二、设计触发器

触发器是按照一定规范开发出来的普通DLL,该DLL必须导出一个名为Execute的函数。

每个元素都可以有多个触发器。也就是说,每个元素可以有多个分解前触发器,也可以有多个分解后触发器,这些触发器会被依次执行。但是,只要有一个分解前触发器表示反对,则该元素的分解过程将被取消,分解后触发器也将不会被执行。

(1)原型声明:

extern “C” __declspec(dllexport) long __stdcall Execute(ELEMENT *pEle)

(2)枚举常量:

enum {etFile, etDir, etPack}; // 元素类型:文件、目录、包。

enum {tsBefore, tsAfter}; // 触发条件:分解前、分解后。

(3)输入参数:

typedef struct

{

HWND m_hWnd; // 主窗口句柄

IDispatch* m_pXmlDoc; // 解包用XML控制文件

char m_szPackPath[MAX_PATH]; // 用户指定的解包物理全路径。

char m_szElementPath[MAX_PATH]; // 当前要分解的文件或目录在包里的全路径。

long m_nElementType; // 元素类型。

long m_nTriggerSituation; // 触发条件。

} ELEMENT;

(4)返回值:

(A)-1:退出整个解包过程;

(B)0:取消本元素的分解过程;(仅对分解前触发器有效)

(C)1:成功;

(5)错误描述

解包过程在调用触发器时可能会发生错误,原因如下:

(A) 不是有效的DLL文件;

(B) DLL文件不存在;

(C) 未导出Execute函数;

(D) Execute函数原型不正确;

(E) Execute函数体执行异常;

解包过程在检测到上述错误时将询问是继续运行还是退出整个解包过程。

显然,如果上述错误发生在元素分解前,则该元素的分解过程将被取消,分解后触发器也将不会被执行。

三、配置触发器

(1)格式

<XyUnPack Package=”XySetup.cpd” UnPackPath=”C:\Program Files\Software\Freesky\Budget”>

<Trigger>

<Common FileName="xx1.dll" For="FILE/DIR/PACK/ALL" When="BEFORE/AFTER/ALL" />

<Single FileName="xx1.dll" For="Test1\1.doc" When="BEFORE/AFTER/ALL" />

<Single FileName="xx2.dll" For="Test1\Test2" When="BEFORE/AFTER/ALL" />

<Single FileName="xx3.dll" For="" When="BEFORE/AFTER/ALL" />

</Trigger>

</XyUnPack>

(2)说明

(A) 可以为每个元素配置独立触发器,此时使用<Single>标记,FileName表示触发器的文件名,For表示目标元素在包里的全路径,When表示触发条件。特别注意的是,For=""表示的是包。

(B) 可以为所有元素设置通用触发器,此时使用<Common>标记,FileName表示触发器的文件名,For表示元素类型,When表示触发条件。

(C) 如果一个元素上既有“通用触发器”又有“独立触发器”,则不管是在分解前还是在分解后,总是先执行“通用触发器”后执行“独立触发器”。

四、内置触发器

比如,解包过程可以内置一些“包分解后”类型的触发器,功能及配置如下所述。

(1) 创建虚拟目录

<XyUnPack>

<Trigger>

</Trigger>

<VirtualDirectory>

<Add Name=”Budget” Path=”Test1” />

<Add Name=”BudgetWebService1” Path=”Test2\Test3” CreateNew=”1” />

<Add Name=”BudgetWebService2” Path=”” />

</VirtualDirectory>

</XyUnPack>

注:Name表示虚拟目录名,Path表示和该虚拟目录对应的包里的目录的全路径。特别注意的是,Path=""表示的是用户指定的解包的物理路径。当虚拟目录已经存在且CreateNew=”1”时则先删除再创建。

(2) 注册COM组件

<XyUnPack>

<Trigger>

</Trigger>

<VirtualDirectory>

</VirtualDirectory>

<RegServer>

<Add Path=”Test1\1.dll” />

<Add Path=”Test1\Test2\2.dll” CopyTo=”%WIN%” />

<Add Path=”Test1\Test2\3.dll” CopyTo=”%WIN%” NoReg=”1” />

</RegServer>

</XyUnPack>

注:Path表示需要注册的包里的文件的全路径。CopyTo表示先拷贝到指定的物理目录(也可以是%WIN%,%SYS%,%TEMP%)再注册,指定的物理目录如果不存在将自动创建。有时可能仅仅要把文件拷贝到其他物理目录而不需要注册,就可以设置NoReg属性。

(3) 写注册表

<XyUnPack>

<Trigger>

</Trigger>

<VirtualDirectory>

</VirtualDirectory>

<RegServer>

</RegServer>

<RegEdit>

<Add Key=” HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft” Name=”User” Value=”sa” />

<Add Key=” HKEY_CURRENT_USER\SOFTWARE\Microsoft” Name=”User” Value=”sa” />

</RegEdit>

</XyUnPack>

(4) 运行EXE程序

<XyUnPack>

<Trigger>

</Trigger>

<VirtualDirectory>

</VirtualDirectory>

<RegServer>

</RegServer>

<RegEdit>

</RegEdit>

<ExeName>

<Add Path=”Test1\hello.exe” />

<Add Path=”Test1\Test2\world.exe” WaitExit=”1” />

</ExeName>

</XyUnPack>

注:Path表示需要运行的包里的文件的全路径。WaitExit表示解包过程是否需要等待运行的EXE结束。

(5) 创建快捷方式

暂缓

(6) 略

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有