如何使我的程序在Windows Vista和Windows 7中运行?

8
我有一个用Delphi 2006编写的应用程序,在Windows XP上运行良好。我使用Inno Setup打包了该应用程序,使用Program Files作为默认文件夹。一些用户迁移到了Windows Vista和Windows 7。问题在于,该应用程序会自己在安装文件夹中创建一些文件。这在XP上可以正常工作,但在Windows Vista中,用户遇到了一些问题(文件不出现等)。在调查用户的报告后,我发现了KB 927387:"Windows Vista或Windows 7中的常见文件和注册表虚拟化问题。"
以管理员权限运行该应用程序就可以解决问题,但我认为这是一个糟糕的解决方法。我想知道是否有任何指令或提示,使该应用程序与Vista和7兼容,因为更多的用户将很快迁移到这些操作系统。

当用户是标准用户时,在Windows XP上你会做什么? - Ian Boyd
5个回答

13

你需要重写你的应用程序,将其文件存储在正确的位置,即使在XP中,但尤其是在Vista及以后的版本中,特别是如果启用了UAC。随着微软每个新的操作系统版本不断加强安全模型并实施控制,正确管理应用程序和用户相关文件的规则变得越来越重要。如何正确管理应用程序和用户相关文件的规则已在MSDN上有所记录,例如:“Windows 2000桌面应用程序的应用程序规范,第4章:数据和设置管理”“Windows 2000桌面应用程序的应用程序规范,附录A:最佳实践”(是的,它们有些旧,但仍然相当相关)。查看SHGetSpecialFolderLocation(),SHGetFolderPath(),SHGetKnownFolderPath()和其他相关函数可以帮助你。


12

对于Vista/Win7,除非用户控制账户已关闭或应用程序正在以提升的方式运行,否则您的应用程序无法将文件放在Program Files/Programs的子文件夹中。请注意,“提升”并不一定意味着“以管理员身份登录”。非管理员用户可以提升权限,而管理员也不一定提升了权限。

如果该应用程序尝试写入Program Files但未获得提升权限,则操作系统会阻止该应用程序或“虚拟化”写入(将文件放在其他地方),这取决于UAC的配置方式。无论哪种情况,都不能帮助该应用程序成功完成它试图执行的操作。

因此,它需要把它们放在其他地方。这取决于创建文件的原因,而您没有告诉我们这些信息。您可以阅读本文了解选项。请注意,除了用户的AppData和Roaming文件夹外,还有一个“所有用户”(共享)配置文件。

您可能需要查看本文和屏幕演示,从Delphi的角度深入讨论了UAC。


4

除了安装时使用的文件外,您为应用程序创建的其他文件应放置在ProgramData目录中(如果是全局的),或者放置在用户ApplicationData目录中(如果是特定于用户的)。

对于必须将文件放置在程序文件目录中的情况,您可以使用com请求提升权限。 详细讨论了这一点,并且还提供了特定于Delphi的部分。 我曾经使用此方法之一是在修补用户安装基础时。 他们会收到UAC的警告,表示系统需要进行更改,因此如果您将其作为自动化任务执行,则可能需要重新考虑逻辑以使其更加用户驱动。


3

2

我曾在Stack Overflow上提出类似的问题(链接)

最终,我意识到需要在安装时将应用程序放入Program Files(需要UAC /提升权限),然后将我的应用程序数据存储在用户的App Data文件夹中。我不得不更改程序生成“默认”配置设置的方式以及保存这些内容的位置,但最终的努力是值得的——我们最终获得了一个可以在XP、Vista和Windows 7上安装和运行的东西。

在这种情况下,我们唯一需要UAC的是在安装时,这对我来说是有意义的(在Mac上安装时也会遇到类似的问题)。在这种特殊情况下,我们没有任何所有用户共享的数据,但如果有的话,我将会查看Program Data特殊文件夹。

我们使用的安装程序软件(Setup Factory)使得这个过程相当简单(我们只需编写一小段代码来检测XP与Vista / Win7并相应地选择正确的特殊文件夹)。根据我的有限经验,在Inno Setup中也很容易实现这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接