【问题标题】:How do I get the application data path in Windows using C++?如何使用 C++ 在 Windows 中获取应用程序数据路径?
【发布时间】:2010-05-24 17:46:04
【问题描述】:

我浏览了整个互联网,但似乎找不到合适的解决方案。我希望能够在 C++ 中以编程方式获取资源管理器可以转换为真实路径的路径“%ALLUSERSPROFILE%\Application Data”。

我可以在不依赖第三方代码的情况下做到这一点吗?

【问题讨论】:

    标签: c++ windows 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的回答

    1. 我必须包含 shlobj.h 才能使用 SHGetFolderPath

    2. 通常您可能需要从 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 库来使用这种方法。
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 2014-11-22
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多