如何在代码中正确使用%USERPROFILE%?

时间:2011-07-26 08:51:34

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

我的代码是否正确?它似乎可以编译,但无法正常工作..

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

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

2 个答案:

答案 0 :(得分:10)

答案是你根本不使用环境变量。相反,您使用专门设计的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.
}

答案 1 :(得分:1)

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

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