我的代码是否正确? 看来可以编译但不能正常工作..
CString testing = _T(" --url=") + cstring + _T(" --out=%USERPROFILE%\\snapshot.png");
我想把它指向用户的文件夹..但仍然无法工作。
答案是你根本不使用环境变量。 而是使用专门设计来检索特殊文件夹路径的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. }
或者,使用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. }
正如Cody所建议的那样,最好使用SHGetSpecialFolderPath函数。 但是,您可以使用GetEnvironmentVariable函数来获取系统中设置的变量和其他变量。
TCHAR szBuf[MAX_PATH] = {0}; ::GetEnvironmentVariable(_T( "USERPROFILE" ), szBuf, MAX_PATH);