【发布时间】:2011-10-13 05:43:57
【问题描述】:
我的代码正确吗?它似乎可以编译但不能正常工作..
CString testing = _T(" --url=") + cstring + _T(" --out=%USERPROFILE%\\snapshot.png");
我想将它指向用户的文件夹..但仍然无法工作。
【问题讨论】:
标签: c++ windows winapi visual-c++ environment-variables
我的代码正确吗?它似乎可以编译但不能正常工作..
CString testing = _T(" --url=") + cstring + _T(" --out=%USERPROFILE%\\snapshot.png");
我想将它指向用户的文件夹..但仍然无法工作。
【问题讨论】:
标签: c++ windows winapi visual-c++ environment-variables
正如 Cody 所建议的,最好使用 SHGetSpecialFolderPath 函数。但是,您可以使用 GetEnvironmentVariable 函数来获取系统中设置的该变量和其他变量。
TCHAR szBuf[MAX_PATH] = {0};
::GetEnvironmentVariable(_T( "USERPROFILE" ), szBuf, MAX_PATH);
【讨论】:
答案是您根本不使用环境变量。相反,您使用专门设计用于检索特殊文件夹路径的 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.
}
【讨论】: