首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MoveFileEx()返回ERROR_SHARING_VIOLATION

MoveFileEx()返回ERROR_SHARING_VIOLATION
EN

Stack Overflow用户
提问于 2015-06-23 17:15:22
回答 2查看 1K关注 0票数 0

我正在开发一个程序,它可以对我们主程序的模块进行实时更新。

如果主可执行文件正在运行,它需要

1)重命名为临时名称,如:%productpath%\main.exe -> %productpath%\temp\temp.exe

::MoveFileEx(%productpath%\main.exe, %productpath%\temp\temp.exe, MOVEFILE_REPLACE_EXISTING) - GetLastError()返回ERROR_SHARING_VIOLATION

2)删除临时文件直到重启

::MoveFileEx(%productpath%\temp\temp.exe, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);

3)将新下载的可执行文件复制到原始路径%productpath%\main.exe

我的问题是,为什么它在第一步失败,因为exe正在运行,所以MoveFileEx()返回ERROR_SHARING_VIOLATION

我的更新程序具有管理员权限。

EN

回答 2

Stack Overflow用户

发布于 2015-06-24 11:57:27

我已经弄明白了,不管怎么说,非常感谢!

我在调用MoveFileEx()时遇到的错误ERROR_SHARING_VIOLATION是因为存在句柄泄漏。在更新exe/dll文件之前,我已经计算了文件MD5以与从服务器端获得的值进行比较,但它错过了CloseHandle()调用...因此,这意味着不可能在打开运行exe的另一个exe中重命名该运行的exe。当我添加ClosedHandle()时,它可以工作,运行的exe可以重命名为另一个临时文件夹,没有任何问题。

票数 1
EN

Stack Overflow用户

发布于 2015-06-23 17:52:53

我的问题是,为什么它在第一步失败,MoveFileEx()返回ERROR_SHARING_VIOLATION,因为exe正在运行?

因为当windows启动一个进程时,它会锁定它的可执行文件以防止被修改。这样一来,windows就不需要将整个图像加载到内存中,并且可以按需对其进行分页。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30998668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档