【问题标题】:Why can't I find the #define for CSIDL_PROFILES?为什么我找不到 CSIDL_PROFILES 的#define?
【发布时间】:2009-06-25 17:59:12
【问题描述】:

我正在尝试使用ShGetFolderPath 来确定用户配置文件文件夹的路径。文档指出 CSIDL_PROFILES 定义了这个文件夹:

CSIDL_PROFILES (0x003e)

6.0 版。包含用户配置文件文件夹的文件系统目录。典型的路径是 C:\Documents and Settings。

我使用 Visual Studio 2005 SP1,在 Platform SDK 包含文件中找不到常量CSIDL_PROFILES 的定义?我需要新版本的 Platform SDK 吗?

所以我通过使用 ID 0x3e 代替符号进行了更多实验。但是,看起来 0x3e 不是接受 CSIDL_* 参数的 shell 函数的有效参数(返回无效参数错误)。

所以我猜 CSIDL_PROFILES 不是一个有效的参数,并且当他们提到这个符号时,至少有一些关于这个主题的 MSDN 页面是不正确的。我不得不说,在我使用 Win32/MSDN 文档的所有岁月中,我不记得有类似的情况。

【问题讨论】:

  • 您能否提供一个指向引用 CSIDL_PROFILES 的 MSDN 页面的链接?我找不到...
  • @Roddy,我在 msdn.com 上找不到它,我找到的参考资料在 VS2005 附带的本地 MSDN 帮助中; ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/shellcc/platform/shell/reference/enums/csidl.htm

标签: winapi windows-shell


【解决方案1】:

没有MSDN documentation for CSIDLs 中列出,因此更新版本的 PSDK 不太可能帮助您。

显然你可以自己做:

#define CSIDL_PROFILES 0x003E

...但鉴于它似乎完全没有被 MS 记录在案,我不建议这样做。

【讨论】:

  • 奇怪的是它出现在 MSDN 页面的一个版本中(VS2005 附带的那个)。就好像他们已经将其删除了一样。我确实尝试过直接使用 ID,但这似乎不起作用,因为当我使用 0x3e 时,shell 函数返回无效的参数代码。
【解决方案2】:

当有人注意到它毫无价值时,我会说它已被删除。无论如何,你能用它做什么?您仍然需要为每个用户确定他的个人资料是否实际存在于该目录下。但是,由于您通常会按用户检查此内容,因此您需要默认设置的唯一一点是创建新用户配置文件时。无论如何,这都是 Windows 内部代码。

【讨论】:

  • 就我而言,它会很有用。实际上,我确实需要知道该文件夹的位置,因为我需要遍历所有用户配置文件文件夹并将文件复制到每个“SendTo”文件夹。请记住,此代码是在以管理员权限运行的安装期间运行的。最后,我必须阅读当前用户配置文件文件夹并确定父文件夹。
  • 不,这确实是一个很好的例子,为什么它是错误的。正确的解决方案是遍历所有用户,然后为每个用户检索他们的个人资料文件夹。如果计算机同时具有漫游和非漫游配置文件,您的解决方案将失败。
【解决方案3】:

您应该使用GetProfilesDirectory(),但如果您真正想要的是其他用户的 CSIDL,您应该使用他们的令牌调用 SHGetFolderPath。 (如果你没有他们的令牌,你需要使用a hacky workaround

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2021-01-09
    • 2011-11-25
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    相关资源
    最近更新 更多