【问题标题】:Overwriting DLL throws Access Denied / Error 5 in Windows 7覆盖 DLL 在 Windows 7 中引发拒绝访问/错误 5
【发布时间】:2011-07-30 22:04:48
【问题描述】:

我为我的应用程序开发了一个自动更新程序,它从更新服务器获取所有文件的 MD5 哈希列表,并在不匹配的情况下下载新文件。 目前,这只发生在主 DLL 文件中,它在更新程序完成工作之后(!)在运行时加载。

它在 Windows XP 中完美运行,但一些用户已经抱怨更新程序在尝试覆盖上述 DLL 文件时给他们错误 5 访问被拒绝。如果他们以管理员权限运行它,它可以工作,但是对于他们来说,在启动程序时总是同意管理员权限是一件烦人的事情。

我的问题:为什么访问覆盖该 DLL 被拒绝,有没有办法在没有 UAC 提示的情况下实现它?

或者:有没有办法让应用程序以管理员身份永久运行,用户只需同意一次,而不是每次运行时都同意。

PS: 我正在使用 Qt 4.7,尤其是带有 QFile::WriteOnly 的 QFile::open 方法 | QFile::Truncate 并在打开失败时调用 QMessageBox 并显示 errorString() 和一些解释。

谢谢!

【问题讨论】:

  • 我电脑上的所有自更新应用程序都需要管理员权限。我不明白为什么你的申请应该得到优惠待遇。

标签: dll access-denied qfile


【解决方案1】:

您是否确定应用程序是“单实例”,即从不运行两次?

如果不是这样可以解释......

至于让应用程序始终以管理员身份运行 - 你不应该这样做...

编辑:
至于 Windows 7:
您正在尝试直接覆盖程序中的某些内容...这是操作系统的一项安全措施,以防止在没有管理员权限的情况下在那里写入...

这些可以帮助处理 UAC:

http://msdn.microsoft.com/en-us/library/bb756929.aspx
http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/20acb8b9-8b9c-4a85-9416-fccdef579f10/
Windows 7 and Vista UAC - Programmatically requesting elevation in C#

【讨论】:

  • 我确定没有其他实例在运行,是的。 “直接覆盖程序中的某些内容”是如何定义的?相同的工作目录?
  • 在 Windows 中,程序通常安装在名为 Programs... 的目录下,而较新的 Windows 版本可防止在没有管理员权限的情况下写入该目录
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2011-04-29
  • 2013-12-20
  • 2014-05-21
相关资源
最近更新 更多