如何使用 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】:

使用 SHGetFolderPathCSIDL_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 &lt;tchar.h&gt; 您应该使用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

如何使用 C++ 在 Windows 中获取硬件信息?

C++下的跨进程交互

如何使用 C++ 在 Windows 中获取 MAC 地址? [关闭]

使用 C++ 在 Windows 中获取时区

如何在windows c++中的cmd中运行命令后获取退出代码