2017-03-09 104 views
1

我正在开发一个跨平台的库,用于从用户的主目录加载配置文件。这个想法是自动提供配置参数而无需编辑代码。如何在Windows上获取用户主目录?

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

+0

为什么Linux的标签? –

+0

试图获得跨平台开发人员的关注。 – ruipacheco

+1

@ruipacheco无论如何,进行跨平台开发的人很可能会同时使用这两个标签,但是,只进行linux开发的人无法回答您的问题。 –

回答

0

那么你想获得用户主目录在服务状态? - 如果您希望处于服务状态,则必须使用GetUserToken()获取用户令牌,然后将其复制为CreateprocessAsUser() - 否则我认为使用SHGetSpecialPath(),SHGetTempPath()更好。

+0

SHGetSpecialPath也适用于桌面应用程序吗? – ruipacheco

+1

Attenzion !!只能在5.2〜5.3版本的桌面应用程序中使用。 - MSDN [https://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85)。aspx] – Bryant

+0

该页是404. – ruipacheco

0

你可以使用ExpandEnvironmentStrings(...)

+0

该变量并不总是存在。 –

0

这个怎么样化解%HOMEPATH%:

#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

+0

不,不,不!配置文件目录不是配置文件的正确位置。尝试'CSIDL_APPDATA'。 –

+0

从我所了解的他想要的用户的主目录。 – user1488118

+0

当有人提出错误的问题时,总会有[分歧](https://weblogs.asp.net/alex_papadimoulis/408925)关于如何做出最好的回应。我坚信你会给他们提供他们需要的信息,而不是(或者说)他们所要求的信息。 –

0

控制台应用程序最简单的方法是要么检索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 
+0

这些变量可以在桌面/电话应用程序中被覆盖吗? – ruipacheco

+0

用户配置文件不是配置文件的正确位置。 –

+0

@ruipacheco令人怀疑他们会被覆盖或更改。 – Paul

相关问题