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

Posted

技术标签:

【中文标题】如何使我的程序在 Windows Vista 和 Windows 7 中运行?【英文标题】:How do I make my program work in Windows Vista and Windows 7? 【发布时间】:2011-01-01 10:23:12 【问题描述】:

我有一个用 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 上做什么? 【参考方案1】:

我有类似的询问here(堆栈溢出)。

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

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

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

【讨论】:

【参考方案2】:

您创建的供您的应用程序使用的文件(不是在安装时创建的)如果对工作站是全局的,则应放入 ProgramData 目录,如果对用户是特定的,则应放入用户的 ApplicationData 目录。

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

【讨论】:

【参考方案3】:

您需要重新编写您的应用程序以将其文件存储在适当的位置,即使在 XP 中也是如此,但尤其是在 Vista 及更高版本中,尤其是在启用 UAC 的情况下。随着微软不断锁定并在每个新的操作系统版本中强制执行其安全模型,这一点变得越来越重要。如何正确管理应用程序和用户相关文件的规则记录在 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()等相关函数对你有帮助。

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

这里是 another article,作者是 Zarko Gajic,它展示了如何获取不同的系统目录。也可以看看this related question。

【讨论】:

以上是关于如何使我的程序在 Windows Vista 和 Windows 7 中运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vista 和 Windows 7 上从我的应用程序启动屏幕键盘

如何在 Windows 中从我的 VS2008/C++ 应用程序中执行一个程序来替换调用者并在 xp/vista/7 上运行?

如何使用 Delphi 在控制台应用程序中激活玻璃效果(Windows Vista/7)

作为开发人员,我应该如何使用 Windows Vista(和 Windows 7)中的特殊文件夹?

如何在 Windows Vista 和更高版本(Windows 7、2008)中查看 .NET 程序集的程序集版本?

如果路径受到保护,请求 Windows Vista UAC 提升?