我实现了一个 self 升级过程,其中我的主应用程序 exe 启动了一个更新程序 exe,在命令行上将句柄传递给自身。然后应用程序 exe 调用 ExitProcess 退出,更新程序在传入的句柄上调用 WaitForSingleObject 以等待应用程序 exe 终止。
WaitForSingleObject 会等待。在应用程序调用 ExitProcess 之前,更新程序会停止。
但是,有时,当更新程序试图用新版本覆盖应用程序 dll 时,我会收到一个文件锁定错误,我的更新程序的当前版本将其视为不可恢复的错误并终止。似乎包含一个任意的 sleep(100) 就足以绕过这个“问题”,但我真的很讨厌这样的代码。真的很讨厌。
我觉得很奇怪,进程句柄可以在主应用程序还活着足以锁定 dll 文件时发出信号。
最佳答案
进程在应用程序代码退出时发出信号。操作系统可能需要更多时间才能完全卸载该进程。发出信号的目的是说“我已经完成了我需要做的事情”,释放可能真正有用的东西的其他代码比让这些代码等待操作系统做一些内务处理更有效。
关于windows - Windows何时发出进程句柄信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/468403/