我正在开发一个跨平台库,用于从用户的主目录加载配置文件。我们的想法是在不编辑代码的情况下自动提供配置参数。
此库可用于桌面应用程序或守护进程/服务。在(我假设)大多数Unix环境中,我可以使用getpwuid()
来获取用户的主目录。在Windows SO told me中,我可以使用SHGetKnownFolderPath,但其文档仅针对桌面应用说明。有没有办法在Windows上为运行服务的用户获取此路径?
答案 0 :(得分:1)
对于控制台应用程序,最简单的方法是检索USERPROFILE
环境变量或连接HOMEDRIVE
和HOMEPATH
环境变量的值。
使用标准库中的getenv()
功能:https://msdn.microsoft.com/en-us/library/tehxacec.aspx
示例程序:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
printf("USERPROFILE = %s\n", getenv("USERPROFILE"));
printf("HOMEDRIVE = %s\n", getenv("HOMEDRIVE"));
printf("HOMEPATH = %s\n", getenv("HOMEPATH"));
return 0;
}
输出:
USERPROFILE = C:\Users\myuser
HOMEDRIVE = C:
HOMEPATH = \Users\myuser
答案 1 :(得分:0)
那么你想让用户主目录处于服务状态吗?
- 如果您希望处于服务状态,则必须使用GetUserToken()
获取用户令牌,然后将其复制为CreateprocessAsUser()
- 否则我认为最好使用SHGetSpecialPath()
,SHGetTempPath()
。
答案 2 :(得分:0)
您可以使用ExpandEnvironmentStrings(...)
答案 3 :(得分:0)
这个怎么样:
#include <shlobj.h>
WCHAR profilePath[MAX_PATH];
HRESULT result = SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, profilePath);
if (SUCCEEDED(result)) {
// Do whatever you want with it
// For example:
// QString::fromWCharArray(profilePath)
}
我还没有测试过它。
请注意,您收到的是一个wchar数组(处理带有特殊字符的路径所必需的)。
我认为使用hToken
参数查询除当前用户以外的其他用户的特殊文件夹也是可能的。
另请参阅文档:https://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85).aspx
我在另一个需要获取开始菜单位置的情况下使用了此代码。请参阅此答案:C++: How do I create a Shortcut in the Start Menu on Windows