Vb6 我应该在哪里存储特定于应用程序的设置?

Vb6 我应该在哪里存储特定于应用程序的设置?,vb6,windows-7,windows-xp,settings,Vb6,Windows 7,Windows Xp,Settings,我被要求更新一个在WinXP上运行了6年的VB6应用程序。客户端希望使用Windows 7。到目前为止,该应用程序将其设置存储在位于应用程序目录中的INI文件中。XP和7之间的一个关键区别是,您不能再写入C:\Program Files\AppFolder 我正在试图找出我应该在文件系统的何处存储设置?考虑到应用程序仍然需要在WinXP上运行,我有点困惑 在WinXP上,我有以下功能: C:\Documents and Settings\profilename\Application Data

我被要求更新一个在WinXP上运行了6年的VB6应用程序。客户端希望使用Windows 7。到目前为止,该应用程序将其设置存储在位于应用程序目录中的INI文件中。XP和7之间的一个关键区别是,您不能再写入
C:\Program Files\AppFolder

我正在试图找出我应该在文件系统的何处存储设置?考虑到应用程序仍然需要在WinXP上运行,我有点困惑

在WinXP上,我有以下功能:

C:\Documents and Settings\profilename\Application Data
C:\Documents and Settings\profilename\Local Settings\Application Data
C:\Users\profilename\AppData\Local
C:\Users\profilename\AppData\LocalLow
C:\Users\profilename\AppData\Roaming
在Windows 7上,我有以下功能:

C:\Documents and Settings\profilename\Application Data
C:\Documents and Settings\profilename\Local Settings\Application Data
C:\Users\profilename\AppData\Local
C:\Users\profilename\AppData\LocalLow
C:\Users\profilename\AppData\Roaming
这些文件夹中的每一个都有子文件夹,这些子文件夹似乎存储各种产品的设置/文件

因此,有两个问题:

  • 给定所有这些文件夹,我在哪里存储设置
  • 我假设有一个漂亮的Windows API调用,可以为我提供此文件夹的正确位置。我希望它在XP和7上都能工作。我的假设正确吗?如果是这样的话,我们将不胜感激

  • 有关一些有用的信息,请参见问题“”。

    在XP/Vista/Windows 7上,您可以使用许多特殊文件夹:

    • CSIDL\u APPDATA
      文件夹可能是您最感兴趣的文件夹。存储在此处的数据可供漫游用户在其登录的任何计算机上使用。这是存储简单配置数据的最佳位置。所有用户都具有对此(以及最后一个)文件夹的写入权限。请注意,以上文件夹均不用于用户生成的数据!这应该属于“我的文档”层次结构
    • 强>编辑:如Cody Gray在评论中建议的,也可以考虑对于当前机器总是本地的应用程序数据的代码> CsIDLLLoalAlpAppDATABAS/COD>,但按每个用户的基础上设置。此文件夹中的数据在漫游时不可用,因此如果用户登录到其他计算机,这些数据应该是不会丢失的
    我无耻地从Karl Peterson的一篇文章中复制了上面的解释,并向VB6程序员解释了这一点。卡尔也有一个能帮你找到目录的方法,但他这次把事情搞得太复杂了,使用,如下所示EDITBob下面的评论解释了为什么最好使用后期绑定而不是早期绑定


    在我看来,在这些目录中保存设置是可以的。

    也许您只需将设置保存在Windows注册表中? 那很容易。使用SaveSeting和GetSetting比创建INI文件容易得多。
    从WinNT到Windows 8,在兼容性方面没有问题。

    +1但不要将其视为关键区别。即使在Vista之前版本的Windows上,您也可能不应该写入共享的“程序文件”文件夹。+1
    CSIDL\u APPDATA
    是您可能应该使用的文件夹。但是,对于不应该与用户一起漫游的设置,请考虑使用<代码> csillLoalAlpAppDATAs/Cl>。谢谢,这正是我需要的。我想添加一个警告,即添加一个对shell库的引用并使用早期绑定(加上所有的Shell专用文件夹常量)可能看起来很聪明。微软在为Shell32.dll的COM接口保留二进制兼容性方面并不谨慎。坚持在这个上使用后期绑定,你的程序无论如何都不会在一个紧密的循环中调用它,所以性能没有问题。@Bob很高兴知道。我真想知道为什么Mark发布了一个后期绑定的示例,并计划使用早期绑定。这将是一个有趣的调试错误。请注意,引用Shell控件和自动化来获取这些特殊的文件夹常量是足够安全的,而无需手动编码常量。只需在这里避免使用新的变量,并将任何引用变量声明为对象即可。