如何正确使用%USERPROFILE%内部代码?

我的代码是否正确? 看来可以编译但不能正常工作..

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

我想把它指向用户的文件夹..但仍然无法工作。

答案是你根本不使用环境变量。 而是使用专门设计来检索特殊文件夹路径的shell函数。

在Windows Vista和更高版本上,该函数是SHGetKnownFolderPath 它需要KNOWNFOLDERID值来标识您希望检索其路径的文件夹。 在你的情况下,这将是FOLDERID_Profile

如果您需要定位Windows的早期版本(如XP),则需要使用SHGetSpecialFolderPath函数 。 它需要一个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. } 

正如Cody所建议的那样,最好使用SHGetSpecialFolderPath函数。 但是,您可以使用GetEnvironmentVariable函数来获取系统中设置的变量和其他变量。

 TCHAR szBuf[MAX_PATH] = {0}; ::GetEnvironmentVariable(_T( "USERPROFILE" ), szBuf, MAX_PATH);