Entwickler-Ecke

Windows API - GetCurrUsername unterschlägt alles folgende


Nano-Ware - Mo 10.10.11 20:31
Titel: GetCurrUsername unterschlägt alles folgende
Hey,

ich nutze diese Funktion, die ich im Internet gefunden habe, um den Benutzernamen auszulesen :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function GetCurrUserName: string;
var
  Size              : DWORD;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  SetLength(Result, Size);
  if GetUserName(PChar(Result), Size) then
    SetLength(Result, Size)
  else
    Result := '';
end;


Wenn ich jetzt diesen String ausgebe und mit "+" etwas hintendranhänge wird das unterschlagen:


Delphi-Quelltext
1:
Codex.GetCurrUserName + ' ist cool!'                    


Ergibt "Benutzername"
Sollte ergeben "Benutzername ist cool!"

Warum?


Moderiert von user profile iconNarses: Topic aus Internet / Netzwerk verschoben am Di 11.10.2011 um 09:33


Gausi - Mo 10.10.11 21:31

Ich würde vermuten, dass da noch ein #0 hinten dranhängt. Funktioniert das?

Delphi-Quelltext
1:
trim(Codex.GetCurrUserName) + ' ist cool!'                    


Nano-Ware - Mo 10.10.11 21:45

Danke das hat das Problem gelöst (;


jaenicke - Mo 10.10.11 21:45

Die Funktion ist auch falsch programmiert, siehe Doku:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724432.aspx hat folgendes geschrieben:
On output, the variable receives the number of TCHARs copied to the buffer, including the terminating null character.


Korrekt wäre:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function GetCurrUserName: string;
var
  Size: DWORD;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  SetLength(Result, Size);
  if GetUserName(PChar(Result), Size) then
    SetLength(Result, Size - 1)
  else
    Result := '';
end;


Nano-Ware - Di 11.10.11 00:36

Dann auch nocheinmal ein Danke an Sie Herr Jaenicke!