前言
Inno Setup打包的程序在运行的时候会监测程序是否正在运行,会提示终止运行的程序,但是不知什么原因,自带的终止功能有时不能正常终止,所以这里直接添加了检测代码来自行终止。
检测代码
代码如下:
1 | [Code] |
这里我全局定义了程序的exe名称
1 | #define MyAppExeName "我的程序.exe" |
注意
一定要保证安装的名称不要和程序本身的名称一样,否则会把安装的程序也关闭掉。
与C#程序结合的问题
会出问题的代码:
1 | try |
如果我们用上面的方法来打开安装包的时候,有时正常,
有时候会出现这么一种情况
安装包打开的一瞬间,程序和安装包的程序都退出了。
这是因为process.Start()
创建的进程为子进程,当父进程死后,子进程就会成为父进程,因为安装包会关闭源程序的父子进程,如果在安装包启动后源程序还没退出,就会导致上面的情况。
建议使用下面的方式:
1 | try |
所以解决方法有两种
- 用新的进程非子进程打开安装程序。
- 源程序中添加退出代码,而打包脚本中去掉关闭运行中程序的逻辑。
其实,我更推荐使用第2种方式,因为关闭程序是自己的事情,自己的事情自己做,才不会出问题。
taskkill
1 | taskkill [/s <computer> [/u [<domain>\]<username> [/p [<password>]]]] {[/fi <filter>] [...] [/pid <processID> | /im <imagename>]} [/f] [/t] |
参数
参数 | 说明 |
---|---|
/s <computer> |
指定远程计算机的名称或 IP 地址, (不要使用反斜杠) 。 默认为本地计算机。 |
/u <domain>\<username> |
使用由或 <domain>\<username> 指定 <username> 的用户的帐户权限运行该命令。只有在同时指定了/s参数时,才能指定/u参数。 默认值是当前登录到发出命令的计算机的用户的权限。 |
/p <password> |
指定在 /u 参数中指定的用户帐户的密码。 |
/fi <filter> |
应用筛选器以选择一组任务。 可以使用多个筛选器,也可以使用通配符 (* ) 来指定所有任务或映像名称。 |
/pid <processID> |
指定要终止的进程的进程 ID。 |
/im <imagename> |
指定要终止的进程的映像名称。 使用通配符 (* ) 指定所有映像名称。 |
/f | 指定强制结束进程。 对于远程进程,此参数将被忽略。所有远程进程都被强制结束。 |
/t | 结束指定进程以及由该进程启动的任何子进程。 |