kar*_*ari 2 c++ windows winapi environment-variables visual-c++
我的代码是否正确?它似乎可以编译但不能正常工作..
CString testing = _T(" --url=") + cstring + _T(" --out=%USERPROFILE%\\snapshot.png");
Run Code Online (Sandbox Code Playgroud)
我想将它指向用户的文件夹..但仍然无法正常工作.
Cod*_*ray 10
答案是你根本不使用环境变量.而是使用专门设计的shell函数来检索特殊文件夹的路径.
在Windows Vista及更高版本中,该功能是SHGetKnownFolderPath.它需要KNOWNFOLDERID值来标识要检索其路径的文件夹.在你的情况下,那将是FOLDERID_Profile.
如果您需要定位早期版本的Windows(例如XP),则需要使用该 SHGetSpecialFolderPath功能.它需要一个CSIDL值来标识您要检索其路径的文件夹.再次,在你的情况下,那将是CSIDL_PROFILE.
当然,您不应该直接将数据存储在用户的配置文件文件夹中.所以希望你所展示的代码只是为了演示目的.应用程序应仅在用户配置文件文件夹下的特定位置创建文件,专门用于应用程序数据存储.
这些地点是CSIDL_APPDATA或CSIDL_LOCAL_APPDATA.如果您要创建用户应该能够修改并且应该视为他/她自己的数据,那么将该数据存储在用户的文档文件夹(CSIDL_MYDOCUMENTS)中是合适的.
我的回答中提供了更多使用信息.
示例代码:
TCHAR szFolderPath[MAX_PATH];
if (!SHGetSpecialFolderPath(NULL, szFolderPath, CSIDL_APPDATA, FALSE))
{
// Uh-oh! An error occurred; handle it.
}
Run Code Online (Sandbox Code Playgroud)
或者,使用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.
}
Run Code Online (Sandbox Code Playgroud)