首页 > 解决方案 > 为什么 FOLDERID_ProgramData 返回空字符串?

问题描述

我正在开发这个作为本地服务运行的大型 C++ Windows 应用程序。它尝试获取它返回的那些路径中的各种 Windows 特殊路径(使用完全相同的函数,如下所示):

但是,对于FOLDERID_ProgramData,它返回一个空字符串。当我在收到错误 203 ( )GetLastError()后尝试使用时:SHGetKnownFolderPath()ERROR_ENVVAR_NOT_FOUND

系统找不到输入的环境选项。

我尝试过的是,当我尝试创建如下所示的小片段时,我能够C:\ProgramData获得FOLDERID_ProgramData. 只有当我尝试运行我的主 Windows 应用程序时,它才会返回一个空字符串。

#include <shlobj.h>
#include <iostream>
#include <string>
#include <vector>
#include <iostream>

std::string fun(REFKNOWNFOLDERID  val) {
    PWSTR dirStr;
    if (S_OK == SHGetKnownFolderPath (val, 0, NULL, & dirStr))
    {
        std::wstring str = std::wstring(dirStr);
        std::string ret_str(str.begin(), str.end());
        return ret_str;
    }
    return "failed";
}

int main() {
    std::cout << fun(FOLDERID_ProgramData) << std::endl; // outputs C:\ProgramData
    std::cout << fun(FOLDERID_ProgramFiles) << std::endl; // outputs C:\Program Files
}

可能是因为我将应用程序作为本地服务运行吗?我是否需要通过hToken本地服务请求特定用户的文件夹?

如果是这样,人们将如何去做呢?我看到Create a user token from SID, expand environment variables in user context,但想确定我是否走在正确的轨道上。

我注意到的一件事C:\ProgramData是一个隐藏文件夹。

标签: c++windows

解决方案


推荐阅读