【问题标题】:C++ issues with Windows UACWindows UAC 的 C++ 问题
【发布时间】:2014-02-10 13:04:47
【问题描述】:

我在大约 1000 台 PC 上安装了一个用 C++ 编写的软件,它在使用 Windows UAC 时遇到了一些问题。我正在努力让事情正常运行,但我需要一些帮助来理解问题并找到正确的解决方案。

情况如下:我需要在一些文本/xml文件中写入一些数据,所以我开始(在XP中)将它们写入可执行文件夹中。不推荐,我知道。当 Vista 启动时,所有文件都开始保存到 VirtualStore 文件夹中,这对我来说很好,所以我保持原样。当时我遇到了几个用户的一些问题(见问题 1),但我手动修复了它们,仅此而已。现在使用 Windows 8,我面临着不同的问题(问题 2),我想一劳永逸地正确修复它们。

  1. 第一个问题:在 Windows Vista 中,一些用户最终发现他们的软件是“空的”,就像刚安装时一样。他们所有的工作都没有了。结果发现,Vista 突然在 C:\Program Files\{MyApp} 中查找他们的文件,而不是在 VirtualStore 中查找。将文件从 VirtualStore 复制到 Program 文件夹解决了问题,一直不明白为什么
  2. 第二个问题:现在使用 Windows 8 的一些用户 [他们中的少数人] 遇到了一个不同的、奇怪的事实;我的应用似乎无法在 VirtualStore 中创建文件,但它可以编辑现有文件。因此,如果我手动创建文件,一切正常。如果不是,应用程序将无法运行:程序文件夹和虚拟商店中的文件都不会被修改

现在我想解决问题。我的计划是在 CSIDL_LOCAL_APPDATA 中移动所有需要修改的文件,并让软件在那里保存东西。只有可执行文件会在程序文件夹中。但是,为了向后兼容,我似乎不能使用似乎是 Vista+ 特定的 SHGetKnownFolderPath。所以我会使用 SHGetFolderPath,它已被弃用,我知道,但应该可以在 XP 中工作,并在 Vista+ 中充当 SHGetKnownFolderPath 的包装器,这对我有好处。

我的问题:

  • 对我的问题 1 和 2 有任何想法吗?我想了解他们,以确保我完全击败了他们。
  • 我的计划是否符合 UAC 标准?据我了解,但是...
  • 除了我的解决方法之外,有什么方法可以确保 XP 兼容性?我不喜欢使用已弃用的功能,但我绝对不希望有两个版本(XP 和 Vista+)来处理!

非常感谢您提供的任何帮助。 卢卡

【问题讨论】:

  • 忽略这些问题,它们将不再是问题。 SHGetFolderPath 可以正常获取 AppData。
  • 谢谢@Hans Passant,我会努力让你知道的!

标签: c++ windows windows-8 uac


【解决方案1】:

这些是我对问题 1 和 2 的想法: 1. 如果您正在编写应用程序正在使用的文件,您的文件将被写入 C:\Program Files 的子目录中。为了在此位置 (C:\Program Files) 写入文件,您的应用程序必须以管理员身份运行。出于兼容性原因,如果您尝试将数据写入需要管理员权限才能写入数据的目录,Windows Vista 会将数据写入 VirtualStore。 2. Windows 8 不再使用 VirtualStore。但是,读取权限不需要管理员权限。 是的,您的计划符合 UAC。您的程序和程序使用的文件必须保存在两个不同的目录中。 我会使用 ShGetFolderPath 函数来获取 AppData 目录的路径。此外,此功能与 Windows XP 兼容。您可以检查操作系统版本并为此版本使用适当的功能/接口。 GetVersion 和 GetVersionEx 在 Windows 8 中已更改。这就是为什么我建议在 Windows 8 上使用Version Helper functions 进行版本检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多