gpt4 book ai didi

delphi - delphi中如何获取当前用户的用户名?

转载 作者:行者123 更新时间:2023-12-03 15:19:08 28 4
gpt4 key购买 nike

您好,我正在 Windows 8 中使用 delphi FM2 和 XE3。

我遇到的问题是我希望用户按下按钮,然后导航到位于 appdata ex 中的子文件夹。 C:\Users\Kobus\AppData\Roaming.minecraft

每个人都有不同的用户名,所以这不起作用。

所以我使用此代码来获取用户名:

function GetCurrentUserName : string;
const
cnMaxUserNameLen = 254;
var
sUserName : string;
dwUserNameLen : DWord;
begin
dwUserNameLen := cnMaxUserNameLen-1;
SetLength( sUserName, cnMaxUserNameLen );
GetUserName(PChar( sUserName ),dwUserNameLen );
SetLength( sUserName, dwUserNameLen );
Result := sUserName;
end;

username := GetCurrentUserName;

然后我说 ShowMessage('C:\Users\'+username+'\AppData\Roaming\.minecraft\saves\'); 来检查输出。

我得到的输出是:“C:\Users\Kobus”,由于某种原因,路径名的其余部分丢失了。

我需要显示的是:'C:\Users\'Kobus'\AppData\Roaming.minecraft\saves\'

谢谢。

最佳答案

问题是 dwUserNameLen 包含字符串的长度,包括尾随零终止符。所以当你这样做时:

SetLength(sUserName, dwUserNameLen);

这会导致 sUserName 设置为 'Kobus#0'。然后,您可以将其传递给 Windows API 对话框函数,该函数将该字符串视为空终止字符串,并在杂散空终止符处截断该字符串。

所以你像这样修复它:

SetLength(sUserName, dwUserNameLen-1);

请注意,您还应该检查 GetUserName 的返回值,以防调用失败:

if not GetUserName(PChar(sUserName), dwUserNameLen) then
RaiseLastOSError;

或者更清晰的变体:

Win32Check(GetUserName(PChar(sUserName), dwUserNameLen));

最后一点。这是获取漫游应用程序数据文件夹的错误方法。首先,您假设各种实现细节。您的方法在使用不同命名模式的旧版本 Windows 上将失败。或者某些 future 版本的 Windows。或者以不同方式配置的当前版本。

执行此操作的正确方法是询问系统漫游应用程序数据文件夹所在的位置。使用 CSIDL_APPDATA(对于旧版 Windows 版本)或 FOLDERID_RoamingAppData(对于现代 Windows 版本)来执行此操作。

关于delphi - delphi中如何获取当前用户的用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15555527/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com