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

3

我的代码是否正确?它似乎可以编译,但不能正常工作。

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

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

2个回答

11
答案是您根本不使用环境变量。相反,您使用专门设计用于检索特殊文件夹路径的shell函数。
在Windows Vista及更高版本中,该函数是SHGetKnownFolderPath。它使用KNOWNFOLDERID values来识别您希望检索其路径的文件夹。在您的情况下,那将是FOLDERID_Profile
如果您需要针对早期版本的Windows(例如XP),则需要使用SHGetSpecialFolderPath function。它使用一个CSIDL值来识别您希望检索其路径的文件夹。同样,在您的情况下,那将是CSIDL_PROFILE
当然,您绝不能直接存储数据在用户的个人资料文件夹中。因此,希望您展示的代码只是为了演示目的。应用程序应仅在设计用于应用程序数据存储的特定位置创建文件。
这些位置是CSIDL_APPDATACSIDL_LOCAL_APPDATA。如果您正在创建用户应该能够修改并将其视为自己的数据,则将该数据存储在用户文档文件夹(CSIDL_MYDOCUMENTS)中是适当的。
更多使用信息在我的回答这里中提供。

示例代码:

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
正如Cody所建议的那样,最好使用SHGetSpecialFolderPath函数。但是,您也可以使用GetEnvironmentVariable函数来获取系统中设置的变量和其他变量。
TCHAR szBuf[MAX_PATH] = {0};
::GetEnvironmentVariable(_T( "USERPROFILE" ), szBuf, MAX_PATH);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接