Windows何时发出进程句柄信号?
我有一个自我升级过程,我的主应用程序exe启动一个updater exe在命令行上传递一个句柄.应用程序exe然后调用ExitProcess退出,并且updater在传入的句柄中调用WaitForSingleObject以等待应用程序exe终止.
WaitForSingleObject确实等待.在应用程序调用ExitProcess之前,更新程序会停止. 但是,有时,当更新程序尝试使用新版本覆盖应用程序dll时,我会收到文件锁定错误,当前版本的更新程序将其视为不可恢复的错误并终止.似乎包括任意睡眠(100)足以绕过这个“问题”,但我真的很讨厌这样的代码.真的很讨厌. 对我来说,当主应用程序仍处于活动状态以便锁定dll文件时,可以发出进程句柄的信号,这似乎很奇怪. 解决方法
正如另一个答案所指出的,当进程停止执行时,进程句柄会发出信号,操作系统可能需要更长的时间来释放DLL.
你是对的,依赖睡眠(100)是一个坏主意.你应该在这样的循环中包装覆盖你的DLL: BOOL UpdateDll(LPCTSTR dll_name,WHATEVER whatever) { int tries = 150; while (tries--) { if (TryUpdateDll(dll_name,whatever)) return TRUE; Sleep(200); } return FALSE; } 这一直试图卸载你的DLL 30秒,然后放弃.即使在系统负载很重的情况下,30秒也应该足够,但仍然可以保护您的更新程序永远不会挂起. (如果UpdateDll返回FALSE,请确保向用户显示有意义的错误消息,说明有问题的DLL的名称.) 如果您正在搞乱COM,在退出之前调用CoFreeUnusedLibraries也可能会有所帮助. (http://msdn.microsoft.com/en-us/library/ms679712.aspx)坦率地说,即使你的进程退出,我也不知道COM是否可以保留DLL,但最好是安全的. 底线是Win32 API有很多奇怪之处.只要您能找到可接受的解决方案,您就不必处理每个案例.显然睡眠(100)可能会破裂,但是30秒的轮询循环似乎对我来说是可以接受的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |