我正在开发一个程序,它可以对我们主程序的模块进行实时更新。
如果主可执行文件正在运行,它需要
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?
我的更新程序具有管理员权限。
发布于 2015-06-24 11:57:27
我已经弄明白了,不管怎么说,非常感谢!
我在调用MoveFileEx()时遇到的错误ERROR_SHARING_VIOLATION是因为存在句柄泄漏。在更新exe/dll文件之前,我已经计算了文件MD5以与从服务器端获得的值进行比较,但它错过了CloseHandle()调用...因此,这意味着不可能在打开运行exe的另一个exe中重命名该运行的exe。当我添加ClosedHandle()时,它可以工作,运行的exe可以重命名为另一个临时文件夹,没有任何问题。
发布于 2015-06-23 17:52:53
我的问题是,为什么它在第一步失败,MoveFileEx()返回ERROR_SHARING_VIOLATION,因为exe正在运行?
因为当windows启动一个进程时,它会锁定它的可执行文件以防止被修改。这样一来,windows就不需要将整个图像加载到内存中,并且可以按需对其进行分页。
https://stackoverflow.com/questions/30998668
复制相似问题