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

时间:2010-01-04 21:56:43

标签: windows delphi windows-7 windows-vista

我有一个用Delphi 2006编写的应用程序,它在Windows XP中运行良好。我使用Inno Setup打包应用程序,使用Program Files作为默认文件夹。一些用户迁移到Windows Vista和Windows 7.这里的问题是应用程序在其安装文件夹中创建了一些文件。这在XP中有效但在Windows Vista中用户遇到了创建文件的问题(它们没有出现等等)。在调查用户的报告后,我发现KB 927387:“Windows Vista或Windows 7中的常见文件和注册表虚拟化问题。”

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

5 个答案:

答案 0 :(得分:13)

您需要重新编写应用程序以将其文件存储在适当的位置,即使在XP中,尤其是在Vista之后,尤其是在启用了UAC的情况下。随着Microsoft不断锁定并使用每个新操作系统版本强制执行其安全模型,这一点变得越来越重要。有关如何正确管理应用程序和用户相关文件的规则记录在MSDN上,例如:"Application Specification for Microsoft Windows 2000 for Desktop Applications, Chapter 4: Data and Settings Management""Application Specification for Microsoft Windows 2000 for Desktop Applications Appendix A: Best Practices"(是的,它们已经过时,但仍然非常相关)。查看SHGetSpecialFolderLocation(),SHGetFolderPath(),SHGetKnownFolderPath()和其他相关函数来帮助您。

答案 1 :(得分:12)

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

如果应用程序确实尝试写入Program Files但未升级,则操作系统将阻止应用程序或“虚拟化”写入(将文件放在其他位置),具体取决于UAC的配置方式。这两个人都没有帮助应用程序成功实现它的目标。

因此需要将它们放在其他地方。哪里取决于文件创建的原因,你没有告诉我们。您可以阅读this article以了解相关选项。请注意,除了用户的AppData和漫游文件夹之外,还有一个“所有用户”(共享)配置文件。

您应该查看this article and screencast,它从Delphi的角度深入讨论UAC。

答案 2 :(得分:4)

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

对于绝对必须将文件放在程序文件目录中的情况,可以使用com来请求提升。 This is discussed in great detaildelphi specific bits are also available。我使用过的一个例子是修补我的用户安装基础。 UAC警告他们系统需要进行更改,因此如果您将此作为自动化任务执行,则可能需要重新考虑逻辑以更加用户驱动。

答案 3 :(得分:3)

以下是Zarko Gajic撰写的another article,其中介绍了如何获取不同的系统目录。另请查看this related question

答案 4 :(得分:2)

我有类似的询问here(Stack Overflow)。

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

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

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

相关问题