如何使我的程序在Windows Vista和Windows 7中工作?

我有一个在Delphi 2006中编写的应用程序,在Windows XP中工作正常。 我使用Inno Setup打包了应用程序,使用Program Files作为默认文件夹。 一些用户迁移到Windows Vista和Windows 7.这里的问题是应用程序自己在其安装文件夹内创build一些文件。 这是在XP中工作,但在Windows Vista中,用户遇到了创build文件的问题(他们没有出现等)。 在调查了用户的报告之后,我发现了KB 927387 :“Windows Vista或Windows 7中的常见文件和registry虚拟化问题。

用pipe理员权限运行应用程序只是解决了这个问题,但这是(我认为)一个可怕的解决方法。 我想知道是否有任何指令或技巧,使应用程序兼容Vista和7,因为更多的用户将很快迁移到这些操作系统。

对于Vista / Win7,除非UAC处于关闭状态,否则您的应用程序无法将这些文件放入程序文件/程序的子文件夹中,或者应用程序以提升的方式运行。 请注意,“提升”并不一定意味着“以管理员身份登录”。 非管理员用户可以提升,管理员不一定提升。

如果应用程序尝试写入程序文件但未提升,操作系统将阻止应用程序或“虚拟化”写入(将文件放在其他位置),具体取决于UAC的配置方式。 这两者都不能帮助应用程序取得成功。

所以需要把它们放在别的地方 在哪里取决于为什么文件正在创建,而你还没有告诉我们。 你可以阅读这篇文章来了解这些选项。 请注意,除了用户的AppData和漫游文件夹外,还有一个“所有用户”(共享)配置文件。

你应该看看这篇文章和截屏 ,从Delphi的角度来讨论UAC。

您需要重新编写应用程序,将其文件存储在适当的位置,即使在XP中,尤其是在Vista之后,特别是在启用UAC的情况下。 随着微软在每个新的操作系统版本中一直在锁定和执行其安全模型,这变得越来越重要。 有关如何正确管理应用程序和用户相关文件的规则,请参阅MSDN上的文档,例如: “适用于桌面应用程序的Microsoft Windows 2000应用程序规范,第4章:数据和设置管理”和“适用于Microsoft Windows 2000的应用程序规范桌面应用程序附录A:最佳实践“ (是的,它们是旧的,但仍然非常相关)。 看看SHGetSpecialFolderLocation(),SHGetFolderPath(),SHGetKnownFolderPath()等相关函数来帮助你。

如果您的应用程序不是在安装时创建的文件应该放入ProgramData目录(如果其全局位于工作站),或者放入用户ApplicationData目录(如果它是特定于用户的)。

对于绝对必须在程序文件目录中放置文件的情况,可以使用com来请求提升。 这是非常详细的讨论 , 德尔福特定位也可用 。 我使用过的一个例子是修补我的用户安装库。 UAC警告说系统需要进行更改,所以如果您将此作为自动化任务执行,您可能需要重新考虑逻辑以实现更多的用户驱动。

这是Zarko Gajic的另一篇文章 ,它展示了如何获得不同的系统目录。 也看看这个相关的问题 。

我有一个类似的查询在这里 (堆栈溢出)。

最后,我意识到我需要在安装时将我的应用程序放入Program Files(需要UAC /提升),然后将我的应用程序的数据存储在用户的App Data文件夹中。 我不得不改变我的程序生成“默认”配置设置的方式,以及我在哪里保存这些东西,但最后的努力是值得的 – 我们结束了在XP,Vista和Windows 7上安装并运行良好的东西。

我们得到的唯一一个UAC命中是在安装时,这对我来说是有意义的(你也会在安装时在Mac上得到类似的打击)。 我们没有任何数据在这种情况下对于所有用户都是通用的,但是如果情况是这样的话,我会查看程序数据专用文件夹。

我们使用的安装程序软件(Setup Factory)使得这个过程非常简单(我们只是编写了一小段代码来检测XP和Vista / Win7,并相应地选择正确的特殊文件夹)。 在Inno Setup中也可以做到这一点,从我有限的经验来看也是如此。