- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
软件安装程序的实现原理与方法研究.doc
软件安装程序的实现原理与方法研究
摘 要:本文介绍了自动安装程序实现原理和方法。主要介绍了自解压软件包程序在完成解压任务之后,如何自动完成安装软件的任务,包括如何等待子进程setup.exe、判断setup.exe已经完成安装,然后删除临时文件的方法和过程。
关键词:自解压;安装程序
中图分类号:TP311.52
假如有一个程序要调用一个setup.exe程序,自动安装一个软件,完成安装后再把临时文件和临时目录全部删除,应怎样实现呢?要实现自解压包将包中的压缩文件释放完成后,自动启动setup.exe安装程序很简单,但是完成安装后要删除先前释放的临时文件却稍有麻烦。关键问题就是必须先判断安装程序已经完成了安装,然后才能删除。因为如果在还没有完成安装的时候删除临时文件和文件夹,可能会导致两个严重后果:第一是安装失败,第二是某些文件无法删除(这时它还在内存里)。
那么,如何判断何时安装程序已经完成了安装任务呢?当然可以用while(GetExitCodeProcess(newinfo.hProcess,dwExitCode)dwExitCode==STILL_ACTIVE);来等待setup.exe运行结束。但是问题可能并不这么简单,常常是setup.exe又调用了别的子进程(例如_delis和inst5176什么的),而setup.exe退出后,子进程并未退出,即安装任务仍未完成。早期的WinRAR(2.50版)创建的TempMode自解压文件,在自动启动setup.exe后安装过程之所以会失败,我判断可能就是因为判断错误,即在未完成安装时就把临时文件删除了。由此看来不应把setup.exe的退出作为安装任务完成的标志,而应以是否存在临时目录下的任何程序仍处于执行状态,作为判断依据。即如果存在这样的进程,则安装仍未完成,反之则安装已经完成。下面把笔者的实现思路介绍如下,供感兴趣的同行参考。
1 解决步骤
以下把setup.exe叫做安装程序,把我的程序叫做自动安装程序。
现在假设自动安装程序已经将临时文件释放到临时文件夹,然后可以按照如下步骤来判断何时安装程序已经完成了安装任务:
1.1 创建一个事件。即用系统函数CreateEvent()创建一个事件hEvent;
hEvent=::CreateEvent(
NULL, // SD
FALSE, // reset type
FALSE, // initial state
NULL // object name
);
以便于自动安装程序等待安装任务的完成。
1.2 启动安装程序。启动释放在临时目录(比如C:\WINDOWS\TEMP\MYTEMP)下的安装程序setup.exe:
strcpy(sTemFile,sPath); strcat(sTemFile,\\Setup.exe);
::CreateProcess(sTemFile,NULL,NULL,NULL,FALSE,
CREATE_DEFAULT_ERROR_MODE|CREATE_NO_WINDOW,
NULL,sPath,info,newinfo);
其中sPath中的内容就是临时目录的路径。
1.3 让自动安装程序循环等待。执行如下语句让自动安装程序处于循环等待状态:
::ResetEvent(hEvent);
while(::WaitForSingleObject(hEvent,500)==WAIT_TIMEOUT)
{ IsExit(); }
应当先将事件hEvent复位到无信号状态。IsExit()函数的功能就是判断当前是否有安装程序进程及其子进程存在,若有则表明安装过程仍在进行,若没有则安装已经完成。当安装已经完成时函数IsExit()将事件hEvent置为有信号状态,从而结束循环等待。IsExit()函数的实现后面再单独介绍。
1.4 关闭事件句柄、删除临时文件和文件夹。::CloseHandle(hEvent); RemoveThem(sPath);
其中sPath表示临时目录路径,而函数 RemoveThem()的作用是删除以sPath为根的子目录树,限于篇幅这里将实现过程略去。
2 IsExit()函数的实现
主要是通过调用CreateToolhelp32Snapshot()、Process32First()和Process32Next()这三个系统函数,通过列举系统中进程,来判断安装过程是否完成。在调用列举进程的函数时必须添加#include指令。实现步骤如下:
2.1 调用系统函数CreateTo
原创力文档


文档评论(0)