安装包制作的一点心得

     做安装包同事放假回家了,但最后一天需要修改安装包,需要在安装前先扫描一下进程,删除已经存在的进程
,(不是询问用户,而是偷偷的干掉,没有窗口)。

      一年前做过这方面的安装包,现在只好硬着头皮上了。

      google了一下,知道windows系统目录下自带一个程序taskkill.exe,于是,很快写下了这个方法:

      

1function KillTestProcess():Boolean;
2var
3    ResultCode : Integer;
4begin
5  Result := Exec(ExpandConstant('{sys}\taskkill.exe'), '/f /im TestProcess.exe''', SW_HIDE, ewNoWait, ResultCode);
6end;

   编译,安装。进程被成功杀死。于是发布。

   但是,等等,很快发现有人报告安装时找不到dll:FrameDyn.dll。

    还是老规拒,google一下。

    差FrameDyn.dll的人还真不少,我们不知道用户那里倒底发生了什么事,会没有这一动态库,但做为一个大众软件,我
们的目标就是让用户双击,然后就一直下一步下去,然后成功安装。因为,你每弹出的一个框,都足以让一位用户颤抖
。做为程序员,我们的目标是处理每一个已知错误。

    很明显,现在我们眼前有两个解决方法:
    1,下载FrameDyn.dll,在安装是判断,用户的系统目录下是否存在FrameDyn.dll,如果不存在,把这个dll复制过去,然

后再利用TaskKill.exe去杀进程,当然,在做这些事前,我建议利用Denpandency工具看一下这个taskkill.exe还有没

有依赖别的动态库。

    2,自己定一个SDK程序,干掉这个要删除的进程。我就使用了这一方法。然后重写KillTestProcess函数。

 

 1function KillTestProcess():Boolean;
 2var
 3    ResultCode : Integer;
 4begin
 5  Result := false;
 6    ExtractTemporaryFile('KillTestProcess.exe');
 7    if Exec(ExpandConstant('{tmp}\KillTestProcess.exe'),'','', SW_HIDE, ewWaitUntilTerminated, 
 8
 9ResultCode) then
10    begin
11       Result := true;
12    end;
13    DeleteFile(ExpandConstant('{tmp}\KillTestProcess.exe'));
14end;

 

   问题解决,安心回家过年!

posted @ 2009-01-22 13:53  新起点_不能用  阅读(2909)  评论(9编辑  收藏  举报