我有一个需要自我更新的 VB6 应用程序。为此,PM 建议使用要从应用程序启动的批处理文件。批处理文件应该终止进程,从本地服务器下载新版本,覆盖旧文件并再次启动应用程序。
我的问题是我不确定 taskkill 只有在进程被杀死并且所有使用的资源都被释放后才会返回对父级的控制;特别是,我们想知道进程的 .exe 文件会发生什么。有没有保证在taskkill返回后会解锁?- 当然,理论上它不应该被任何其他进程锁定,这是我们唯一感兴趣的情况。
4 回答
如果进程被杀死,则 exe 将被释放以进行更新。作为使用 taskkill 的替代方法,您可以使用 sysinternals 中的 pskill,但 taskkill 应该可以很好地与 /IM 参数一起使用。
但是,pskill 或 taskkill 都不会在返回控制之前等待进程停止。因此,您必须监视进程以确保它们不再运行。
此外,这将是我的首选解决方案,可以通过单击一次来部署 vb6 应用程序,这将使用新版本自动更新应用程序。查看这篇文章了解详情。
至于进程打开的资源,有可能保持打开状态(比如sql连接),但很可能会成功关闭。您只能通过在进程上测试 taskkill 来监控发生的情况来确定。
希望有帮助。
我通过让应用程序本身检查更新来做到这一点。如果有,则应用程序会将它们下载到临时位置。之后,它将启动一个 (.js) 脚本并退出应用程序。该脚本将等待进程关闭(休眠),复制更新并再次启动应用程序。
这样,您在脚本中的逻辑就会少得多,并且您可以在拥有更多可用工具的环境中完成您的工作。
有一个命令行参数,例如 /Shutdown,VB 程序将处理该参数。
MyApp.exe /关机
/Shutdown 参数将查找应用程序的现有运行实例(使用 FindWindow API)并向窗口发送用户消息,请求它顺利关闭。
Taskkill 应该仅在进程终止后返回(根据下面的评论:如果需要用户输入,请使用 /F 标志强制终止程序)。
要了解有关它的更多信息,您可以使用进程资源管理器并查看进程终止的确切时间,以及是否有人仍然打开 .exe 文件(Ctrl+F 和 exe 的名称) - 但情况并非如此。