我应该在哪里存储应用程序特定设置

Ang*_*ker 14 vb6 settings windows-xp windows-7

我被要求更新过去6年一直在WinXP上运行的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
Run Code Online (Sandbox Code Playgroud)

在Windows 7上,我有以下内容:

C:\Users\profilename\AppData\Local
C:\Users\profilename\AppData\LocalLow
C:\Users\profilename\AppData\Roaming
Run Code Online (Sandbox Code Playgroud)

这些文件夹中的每一个都有子文件夹,似乎存储各种产品的设置/文件

那2个问题:

  1. 鉴于所有这些文件夹,我在哪里存储我的设置?
  2. 我假设有一个漂亮的Windows API调用,它会给我这个文件夹的正确位置.我希望它适用于XP和7.我的假设是否正确?如果是这样,将非常感谢链接.

Mar*_*rkJ 12

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

  • CSIDL_APPDATA文件夹是您可能最感兴趣的文件夹.此处存储的数据可供漫游用户登录的任何计算机使用.这是存储简单配置数据的最佳位置.所有用户都对此(以及最后一个)文件夹具有写入权限.请注意,上述文件夹均不适用于用户生成的数据!这将属于My Documents层次结构.
  • 编辑:正如Cody Gray在评论中建议的那样,还要考虑CSIDL_LOCAL_APPDATA应用程序数据,这些数据始终是当前计算机的本地数据,但是基于每个用户预留.此文件夹中的数据在漫游的基础上不可用,因此它应该是用户在登录到其他计算机时可能不会错过的数据.

我无耻地从Karl Peterson的一篇好文章中复制了上面的解释,为VB6程序员解释了这一点.Karl还有一个即时可用的课程,可以帮助你找到目录,但恕我直言,他这次是过于复杂的事情.Bob Riemersma使用Shell对象在一行中有更好的方法,如下所示.编辑鲍勃在下面的评论解释了为什么最好使用后期绑定而不是早期绑定.

Const ssfCOMMONAPPDATA = &H23 
Const ssfLOCALAPPDATA = &H1c
Const ssfAPPDATA = &H1a
Dim strAppData As String 

strAppData = _ 
    CreateObject("Shell.Application").NameSpace(ssfAPPDATA).Self.Path 
Run Code Online (Sandbox Code Playgroud)

在我看来,继续在这些目录中使用INI文件是可以的.

  • 我想添加一个警告,虽然添加对Shell库的引用并使用早期绑定(加上所有Shell特殊文件夹常量出现)似乎很聪明但是Microsoft一直没有注意保留Shell32的二进制兼容性.dll的COM界面.坚持使用后期绑定,你的程序无论如何都不会在紧密循环中调用它,因此性能不是问题. (4认同)
  • +1`CSIDL_APPDATA`是您应该使用的文件夹.但是,对于不应与用户漫游的设置,请考虑使用`CSIDL_LOCAL_APPDATA`. (3认同)