c++ - 为什么 FOLDERID_ProgramData 返回空字符串?
问题描述
我正在开发这个作为本地服务运行的大型 C++ Windows 应用程序。它尝试获取它返回的那些路径中的各种 Windows 特殊路径(使用完全相同的函数,如下所示):
C:\Program Files
为了FOLDERID_ProgramFiles
C:\Program Files (x86)
为了FOLDERID_ProgramFilesX86
C:\WINDOWS
为了FOLDERID_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
是一个隐藏文件夹。
解决方案
推荐阅读
- java - 你可以重写子类中的超类方法什么都不做吗?
- javascript - 获取回复消息的原始内容。[discord.js]
- php - errno: 150 "迁移时外键约束形成错误
- java - 为什么使用 ComplexPhraseQueryParser 的 Lucene 搜索会为某些内容而不是所有内容抛出异常?
- azure - Defender 365 REST API(您没有任何必需的应用程序权限(Incident.ReadWrite.All、Incident.Read.All)来访问资源)
- javascript - 正确清理请求的数据 - Typescript、React
- git - git 删除不需要的大 blob 文件
- docker-compose - 在 DDEV-Local 中使用 Compose 文件控制 Healthcheck
- spring - 如何添加动态值@where注解
- reactjs - 使用onClick到router.push,在Next.js中获取数据和更新页面