【问题标题】:How to properly use %USERPROFILE% inside code?如何在代码中正确使用 %USERPROFILE%?
【发布时间】:2011-10-13 05:43:57
【问题描述】:

我的代码正确吗?它似乎可以编译但不能正常工作..

CString testing = _T(" --url=") + cstring + _T(" --out=%USERPROFILE%\\snapshot.png");

我想将它指向用户的文件夹..但仍然无法工作。

【问题讨论】:

    标签: c++ windows winapi visual-c++ environment-variables


    【解决方案1】:

    正如 Cody 所建议的,最好使用 SHGetSpecialFolderPath 函数。但是,您可以使用 GetEnvironmentVariable 函数来获取系统中设置的该变量和其他变量。

    TCHAR szBuf[MAX_PATH] = {0};
    ::GetEnvironmentVariable(_T( "USERPROFILE" ), szBuf, MAX_PATH);
    

    【讨论】:

      【解决方案2】:

      答案是您根本不使用环境变量。相反,您使用专门设计用于检索特殊文件夹路径的 shell 函数。

      在 Windows Vista 及更高版本上,该函数为 SHGetKnownFolderPath。它需要KNOWNFOLDERID values 来标识您要检索其路径的文件夹。在你的情况下,那将是FOLDERID_Profile

      如果您需要针对早期版本的 Windows(例如 XP),则需要使用 SHGetSpecialFolderPath function。它需要一个CSIDL 值来标识您希望检索其路径的文件夹。同样,在您的情况下,那将是 CSIDL_PROFILE


      当然,您不应该将数据直接存储在用户的个人资料文件夹中。因此,希望您展示的那段代码仅用于演示目的。应用程序只应在用户配置文件文件夹下的特定位置创建文件,专为应用程序数据存储而设计。

      这些位置是CSIDL_APPDATACSIDL_LOCAL_APPDATA。如果您正在创建用户应该能够修改并应视为他/她自己的数据,那么将这些数据存储在用户的文档文件夹中是合适的 (CSIDL_MYDOCUMENTS)。

      更多使用信息请访问my answer here


      示例代码:

      TCHAR szFolderPath[MAX_PATH];
      if (!SHGetSpecialFolderPath(NULL, szFolderPath, CSIDL_APPDATA, FALSE))
      {
          // Uh-oh! An error occurred; handle it.
      }
      

      或者,使用 MFC 的 CString 类:

      CString buffer;
      BOOL bRet = SHGetSpecialFolderPath(NULL, buffer.GetBuffer(MAX_PATH), CSIDL_APPDATA, FALSE);
      buffer.ReleaseBuffer();
      if (!bRet)
      {
          // Uh-oh! An error occurred; handle it.
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 2017-04-09
        • 2023-03-06
        • 2012-05-22
        • 2018-08-15
        • 1970-01-01
        相关资源
        最近更新 更多