我的代码是否正确?它似乎可以编译,但无法正常工作..
CString testing = _T(" --url=") + cstring + _T(" --out=%USERPROFILE%\\snapshot.png");
我想将它指向用户的文件夹..但仍然无法正常工作。
答案 0 :(得分:10)
答案是你根本不使用环境变量。相反,您使用专门设计的shell函数来检索特殊文件夹的路径。
在Windows Vista及更高版本中,该功能为SHGetKnownFolderPath
。需要KNOWNFOLDERID
values来标识要检索其路径的文件夹。在您的情况下,那将是FOLDERID_Profile
。
如果您需要定位早期版本的Windows(例如XP),则需要使用SHGetSpecialFolderPath
function。它需要CSIDL值来标识您要检索其路径的文件夹。同样,在您的情况下,那将是CSIDL_PROFILE
。
当然,您永远不应该将数据直接存储在用户的个人资料文件夹中。所以希望你所展示的代码只是为了演示目的。应用程序应仅在用户配置文件文件夹下的特定位置创建文件,用于应用程序数据存储。
这些位置为CSIDL_APPDATA
或CSIDL_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);