安装包制作的一点心得
做安装包同事放假回家了,但最后一天需要修改安装包,需要在安装前先扫描一下进程,删除已经存在的进程
,(不是询问用户,而是偷偷的干掉,没有窗口)。
一年前做过这方面的安装包,现在只好硬着头皮上了。
,(不是询问用户,而是偷偷的干掉,没有窗口)。
一年前做过这方面的安装包,现在只好硬着头皮上了。
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;
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;
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;
问题解决,安心回家过年!