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

如何使我的程序在Windows Vista和Windows 7中工作?,windows,delphi,windows-7,windows-vista,Windows,Delphi,Windows 7,Windows Vista,我有一个用Delphi2006编写的应用程序,在WindowsXP中运行良好。我使用Inno设置打包应用程序,使用程序文件作为默认文件夹。少数用户迁移到Windows Vista和Windows 7。这里的问题是,应用程序自己在安装文件夹中创建一些文件。这在XP中运行,但在Windows Vista中,用户对创建的文件有问题(它们不会出现等等)。在调查用户报告后,我发现:“Windows Vista或Windows 7中常见的文件和注册表虚拟化问题。” 使用管理员权限运行应用程序正好解决了这个问

我有一个用Delphi2006编写的应用程序,在WindowsXP中运行良好。我使用Inno设置打包应用程序,使用程序文件作为默认文件夹。少数用户迁移到Windows Vista和Windows 7。这里的问题是,应用程序自己在安装文件夹中创建一些文件。这在XP中运行,但在Windows Vista中,用户对创建的文件有问题(它们不会出现等等)。在调查用户报告后,我发现:“Windows Vista或Windows 7中常见的文件和注册表虚拟化问题。”


使用管理员权限运行应用程序正好解决了这个问题,但(我认为)这是一个糟糕的解决方法。我想知道是否有任何指令或提示可使应用程序与Vista和7兼容,因为不久将有更多用户迁移到这些操作系统。

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

如果应用确实尝试写入程序文件,但未提升,则操作系统将阻止应用或“虚拟化”写入(将文件放在其他位置),具体取决于UAC的配置方式。这两种方法都无法帮助应用程序成功完成它试图完成的任务

所以它需要把它们放在别的地方。位置取决于创建文件的原因,而您还没有告诉我们。您可以通过阅读了解选项。请注意,除了用户的AppData和漫游文件夹外,还有一个“所有用户”(共享)配置文件


您可能应该看看,它从Delphi的角度深入讨论了UAC。

这里是Zarko Gajic的作品,它展示了如何获取不同的系统目录。另外,请看一看。

您需要重新编写应用程序,以便将其文件存储在适当的位置,即使在XP中,尤其是在Vista以后的版本中,尤其是在启用UAC的情况下。随着微软在每一个新的操作系统版本中不断锁定和加强其安全模型,这一点变得越来越重要。如何正确管理应用程序和用户相关文件的规则记录在MSDN上,例如:和(是的,它们很旧,但仍然非常相关)。查看SHGetSpecialFolderLocation()、SHGetFolderPath()、SHGetKnownFolderPath()和其他相关函数以帮助您。

您创建的供应用程序在安装时以外使用的文件应进入ProgramData目录,如果它是工作站的全局文件,或进入用户应用程序数据目录(如果特定于用户)

对于绝对必须在program files目录中放置文件的情况,可以使用com请求提升,和。我使用过的一个例子是修补我的用户安装基础。UAC警告他们,系统需要进行更改,因此,如果您将此作为一项自动化任务来执行,则可能需要重新考虑逻辑,使其更受用户驱动。

我有过类似的查询(堆栈溢出)

最后,我意识到我需要在安装时将我的应用程序放入程序文件(需要UAC/elevation),然后将我的应用程序数据存储在用户的应用程序数据文件夹中。我不得不改变我的程序生成“默认”配置设置的方式,以及我保存这些设置的位置,但最终还是值得付出努力的——我们最终得到了一些可以在XP、Vista和Windows7上正常安装和运行的东西

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


我们使用的安装软件(安装工厂)使这一点相当简单(我们只编写了一小段代码来检测XP与Vista/Win7的对比,并相应地选择正确的特殊文件夹)。从我有限的经验来看,在Inno安装程序中也很容易做到这一点。

如果用户是标准用户,您会在Windows XP上做什么?