我正在开发一个程序,可以对我们主程序的模块进行实时更新。
如果主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正在运行?
我的更新程序具有管理员权限。
答案 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不需要将整个图像加载到内存中,并且可以按需分页。