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