加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows何时发出进程句柄信号?

发布时间:2020-12-14 02:25:37 所属栏目:Windows 来源:网络整理
导读:我有一个自我升级过程,我的主应用程序exe启动一个updater exe在命令行上传递一个句柄.应用程序exe然后调用ExitProcess退出,并且updater在传入的句柄中调用WaitForSingleObject以等待应用程序exe终止. WaitForSingleObject确实等待.在应用程序调用ExitProcess
我有一个自我升级过程,我的主应用程序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秒的轮询循环似乎对我来说是可以接受的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读