Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   GetUsername unter Windows 10 (https://www.delphipraxis.net/187288-getusername-unter-windows-10-a.html)

strom 16. Nov 2015 20:56

GetUsername unter Windows 10
 
Diese Funktion läuft unter Windows 10 nicht :-(

Warum?

Delphi-Quellcode:
uses
  Winapi.Windows
Delphi-Quellcode:
function GetUsername: String;
var
  Buffer: array[0..255] of Char;
  Size: DWord;
begin
  Size := SizeOf(Buffer);
  if not Windows.GetUserName(Buffer, Size) then
    RaiseLastOSError; //RaiseLastWin32Error; {Bis D5};
  SetString(Result, Buffer, Size - 1);
end;

Bernhard Geyer 16. Nov 2015 21:02

AW: GetUsername unter Windows 10
 
was läuft nicht?

strom 16. Nov 2015 21:04

AW: GetUsername unter Windows 10
 
so ist es richtig!

Delphi-Quellcode:
function GetUsername: String;
var
  Buffer: array[0..255] of Char;
  Size: DWord;
begin
  Size := SizeOf(Buffer);
   if not Winapi.Windows.GetUserName(Buffer, Size) then
    RaiseLastOSError;
  SetString(Result, Buffer, Size - 1);
end;

HolgerX 16. Nov 2015 22:58

AW: GetUsername unter Windows 10
 
Hmm..
besser so ;)

Delphi-Quellcode:
function GetUsername: String;
var
  Buffer: array[0..256] of Char; // UNLEN (= 256) +1 (definiert in Lmcons.h)
  Size: DWord;
begin
  Size := length(Buffer); // length stat SizeOf, da Anzahl in TChar und nicht BufferSize in Byte
   if not Winapi.Windows.GetUserName(Buffer, Size) then
    RaiseLastOSError;
  SetString(Result, Buffer, Size - 1);
end;
Lt.
https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx

ist Size die Länge in TChars, nicht in Bytes...

SizeOf liefert bei Unicode aber nicht die 256 Chars, sondern 515 Bytes zurück, somit 512 TChars...

Sir Rufo 16. Nov 2015 23:58

AW: GetUsername unter Windows 10
 
Eine weitere Möglichkeit ist
Delphi-Quellcode:
function GetUserName: string;
var
  lpBuffer : LPTSTR;
  lpnSize  : DWORD;
  lSuccess : Boolean;
  lLastError: Cardinal;
begin
  lpBuffer := nil;
  lpnSize := 0;

  repeat
    lSuccess := Winapi.Windows.GetUserName( lpBuffer, lpnSize );
    if not lSuccess
    then
      begin
        lLastError := GetLastError( );
        case lLastError of
          ERROR_INSUFFICIENT_BUFFER:
            begin
              SetLength( Result, lpnSize );
              lpBuffer := LPTSTR( Result );
            end;
        else
          RaiseLastOSError( lLastError, sLineBreak + 'GetUserName' );
        end;
      end
    else
      SetLength( Result, lpnSize - 1 );
  until lSuccess;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz