如何在Windows上获取用户主目录?

时间:2017-03-09 13:08:29

标签: c++ windows home-directory

我正在开发一个跨平台库,用于从用户的主目录加载配置文件。我们的想法是在不编辑代码的情况下自动提供配置参数。

此库可用于桌面应用程序或守护进程/服务。在(我假设)大多数Unix环境中,我可以使用getpwuid()来获取用户的主目录。在Windows SO told me中,我可以使用SHGetKnownFolderPath,但其文档仅针对桌面应用说明。有没有办法在Windows上为运行服务的用户获取此路径?

4 个答案:

答案 0 :(得分:1)

对于控制台应用程序,最简单的方法是检索USERPROFILE环境变量或连接HOMEDRIVEHOMEPATH环境变量的值。

使用标准库中的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(...)

解决%HOMEPATH%

答案 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