我正在开发一个跨平台的库,用于从用户的主目录加载配置文件。这个想法是自动提供配置参数而无需编辑代码。如何在Windows上获取用户主目录?
此库可用于桌面应用程序或守护程序/服务中。在(我假设)大多数Unix环境中,我可以使用getpwuid()
来获取用户的主目录。在Windows SO told me中,我可以使用SHGetKnownFolderPath,但其文档仅对桌面应用说明。有没有办法在Windows上为运行服务的用户获取此路径?
我正在开发一个跨平台的库,用于从用户的主目录加载配置文件。这个想法是自动提供配置参数而无需编辑代码。如何在Windows上获取用户主目录?
此库可用于桌面应用程序或守护程序/服务中。在(我假设)大多数Unix环境中,我可以使用getpwuid()
来获取用户的主目录。在Windows SO told me中,我可以使用SHGetKnownFolderPath,但其文档仅对桌面应用说明。有没有办法在Windows上为运行服务的用户获取此路径?
那么你想获得用户主目录在服务状态? - 如果您希望处于服务状态,则必须使用GetUserToken()
获取用户令牌,然后将其复制为CreateprocessAsUser()
- 否则我认为使用SHGetSpecialPath()
,SHGetTempPath()
更好。
SHGetSpecialPath也适用于桌面应用程序吗? – ruipacheco
Attenzion !!只能在5.2〜5.3版本的桌面应用程序中使用。 - MSDN [https://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85)。aspx] – Bryant
该页是404. – ruipacheco
你可以使用ExpandEnvironmentStrings(...)
该变量并不总是存在。 –
这个怎么样化解%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
不,不,不!配置文件目录不是配置文件的正确位置。尝试'CSIDL_APPDATA'。 –
从我所了解的他想要的用户的主目录。 – user1488118
当有人提出错误的问题时,总会有[分歧](https://weblogs.asp.net/alex_papadimoulis/408925)关于如何做出最好的回应。我坚信你会给他们提供他们需要的信息,而不是(或者说)他们所要求的信息。 –
控制台应用程序最简单的方法是要么检索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
为什么Linux的标签? –
试图获得跨平台开发人员的关注。 – ruipacheco
@ruipacheco无论如何,进行跨平台开发的人很可能会同时使用这两个标签,但是,只进行linux开发的人无法回答您的问题。 –