MoveFileEx()返回ERROR_SHARING_VIOLATION

时间:2015-06-23 09:15:22

标签: windows winapi movefileex

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

如果主exe正在运行,则需要

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)将新下载的exe复制到原始路径%productpath%\main.exe

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

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

2 个答案:

答案 0 :(得分:1)

我已经弄明白了,无论如何,非常感谢!

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

答案 1 :(得分:0)

  

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

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