0

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

如果主 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

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

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

4

2 回答 2

1

我已经弄明白了,还是非常感谢!

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

于 2015-06-24T03:57:27.123 回答
0

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

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

于 2015-06-23T09:52:53.470 回答