如何使用 C++ 在 Windows 中获取应用程序数据路径?
Posted
技术标签:
【中文标题】如何使用 C++ 在 Windows 中获取应用程序数据路径?【英文标题】:How do I get the application data path in Windows using C++? 【发布时间】:2010-05-24 17:46:04 【问题描述】:我浏览了整个互联网,但似乎找不到合适的解决方案。我希望能够在 C++ 中以编程方式获取资源管理器可以转换为真实路径的路径“%ALLUSERSPROFILE%\Application Data”。
我可以在不依赖第三方代码的情况下做到这一点吗?
【问题讨论】:
【参考方案1】:使用 SHGetFolderPath
和 CSIDL_COMMON_APPDATA
作为 CSIDL。
TCHAR szPath[MAX_PATH];
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath)))
//....
【讨论】:
很好,CSIDL_COMMON_APPDATA 是我正在寻找的 CSIDL。 还有更新的但不一定更高级的 SHGetKnownFolderPath。适用于 Vista 或更高版本。 我还想补充一点,CSIDL_APPDATA 是用户特定的版本。 (COMMON_APPDATA 由所有用户共享)【参考方案2】:只是补充interjay的回答
我必须包含 shlobj.h
才能使用 SHGetFolderPath
。
通常您可能需要从 appdata 读取文件,
为此,您需要使用pathAppend
函数(为此需要shlwapi.h
)。
#include <shlwapi.h>
#pragma comment(lib,"shlwapi.lib")
#include "shlobj.h"
TCHAR szPath[MAX_PATH];
// Get path for each computer, non-user specific and non-roaming data.
if ( SUCCEEDED( SHGetFolderPath( NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath ) ) )
// Append product-specific path
PathAppend( szPath, _T("\\My Company\\My Product\\1.0\\") );
更多详情请见here。
【讨论】:
+1 和注释:要使用 _T("...") 你必须#include <tchar.h>
您应该使用TEXT()
宏而不是_T()
宏(或者,完全停止使用TCHAR
- 除非您确实需要支持Win9x/ME)。 TEXT()
由 Win32 API 使用,_T()
由 C 运行时库使用。【参考方案3】:
您也可以从注册表中读取值
路径 = HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell 文件夹
key = 通用应用数据
【讨论】:
未记录且可能会更改;躲开它。有 API,使用它。 请注意,Win32 世界中所有事物的“可能更改”状态都会发生更改。 API 并不总是可用的。某些不运行桌面的早期版本的 Windows 没有 SHGetFolderPath API。但是,如果您不必支持 Windows XP 或 Windows 2000,则可以依赖 SHGetFolderPath 的可用性。是的,晦涩难懂,也许是一个边缘案例,但已经有足够多的人遇到这种情况,至少可以影响一个 boost 库来使用这种方法。以上是关于如何使用 C++ 在 Windows 中获取应用程序数据路径?的主要内容,如果未能解决你的问题,请参考以下文章
使用 C++ 在 Windows 中获取 OSVersion