我可以使用什么作为C ++中Environment.SpecialFolder.CommonApplicationData的等效项?

时间:2014-03-17 13:37:06

标签: c# c++ windows environment-variables

我正在尝试与检查某个文件是否位于特定位置的特定系统进行交互,如果是,则使用该文件中存储的url下载更新。

我正在使用的C#测试应用程序对话框通过使用C#帮助程序类来解决此问题,该类通过将文件夹附加到“Environment.SpecialFolder.CommonApplicationData”来形成文件的路径。从那里它可以编辑和删除文件来控制系统的行为。所以我的C ++应用程序需要做同样的事情。

我需要的是一种在C ++中获取该路径的方法。我可以重建的每个部分,除了 C#Environment变量,这是特定于操作系统的。

那么,如何在C ++中获取“Environment.SpecialFolder.CommonApplicationData”路径?

(解决我的“查找此文件”问题的解决方案是可以接受的,具体取决于我必须修改的工作代码量)

1 个答案:

答案 0 :(得分:1)

SHGetSpecialFolderPath的MSDN页面说:

  

不支持SHGetSpecialFolderPath。相反,请使用ShGetFolderPath。

但不推荐ShGetFolderPath并包含以下注释:

  

从Windows Vista开始,此功能仅仅是SHGetKnownFolderPath的包装器。 CSIDL值转换为其关联的KNOWNFOLDERID,然后调用SHGetKnownFolderPath。新应用程序应使用已知的文件夹系统而不是旧的CSIDL系统,仅支持向后兼容性。

现在正确的方法是:

#include "stdafx.h"
#include <windows.h>
#include <KnownFolders.h>
#include <ShlObj.h>

int main()
{
    PWSTR path = NULL;

    HRESULT result = SHGetKnownFolderPath(FOLDERID_ProgramData, 0, NULL, &path);
    if (SUCCEEDED(result)) {
        wprintf_s(L"Path: %ls\n", path);
    }

    CoTaskMemFree(path);
    return 0;
}