Announcement
Collapse
No announcement yet.
GetUserName
Collapse
X
-
Ich benutze folgende Hilsfunktion, um nicht jedesmal mit einem PChar mich herumärgern zu müssen:
<pre>
function GetUserNameStr: String;
var
pcUserName : Array[0..255] of char;
iLengthUserName : Cardinal;
begin
iLengthUserName := High(pcUserName);
GetUserName(pcUserName, iLengthUserName);
result := StrPas(pcUserName);
end;
</pre>
Comment
-
Hallo,
über die Delphi-Funktion <b>SysErrorMessage</b> kann man sich den Text zur Win32-Fehlernummer anzeigen lassen:
<pre>
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(SysErrorMessage(1245));
end;
</pre>
Wenn man als Benutzer tatsächlich im Netzwerk angemeldet ist, reichen wohl die Benutzerrechte (Privilegien) nicht aus. Ich würde daher den Test zuerst mit Administratorrechten wiederholen
Comment
-
Hallo,<p>
ich verwende in einer Anwendung (Delphi 4) die Funktion <b>GetUserName</b> (Verwendung von PChar). Irgendwann<br>
(noch während der Entwicklungsphase) lieferte die Funktion nur noch unbrauchbare Zeichen. In anderen Projekten klappt's<br>
aber noch. Ich habe bereits die Projektoptionen verglichen bzw. gleichgestellt. Zuletzt versuchte ich das Ganze mit <br>
<b>GetUserNameA</b> (Verwendung von PAnsiChar), mit Erfolg. <p>
Kann sich jemand denken, warum die Funktion <b>GetUserName</b> in dem einen Projekt nicht mehr funktioniert
Comment
-
Hallo,
wenn man sich die Delphi-Unit <b>Windows.pas</b> näher anschaut, finden sich dort die 3 folgenden Zeilen:
<pre>
function GetUserNameA; external advapi32 name 'GetUserNameA';
function GetUserNameW; external advapi32 name 'GetUserNameW';
function GetUserName; external advapi32 name 'GetUserNameA';
</pre>
Somit "biegt" Delphi jeden Aufruf von GetUserName automatisch auf die Win32-API-Funktion GetUserNameA (für ANSI-Zeichen) um. Die UNICODE-Version GetUserNameW ist nur unter Windows NT/2000 verwendbar und wird daher von Delphi ignoriert, damit die Anwendung auch unter Windows 9x/Me läuft.
Der Fehler muss sich also irgendwo anders eingeschlichen werden. Wie sieht die Deklaration und Vorbereitung der Puffer-Variable aus, in die Win32 den Benutzernamen kopiert? Der folgende Weg sollte in jedem Fall funktionieren:
<pre>
procedure TForm1.Button1Click(Sender: TObject);
var
szUserName : array[0..99] of Char;
dwSize : DWORD;
begin
FillChar(szUserName, SizeOf(szUserName), 0);
dwSize := SizeOf(szUserName);
GetUserName(szUserName, dwSize);
ShowMessage(szUserName);
end;
</pre>
Comment
-
Hallo Herr Kosch,<P>
mit obigem Aufruf hat es funktioniert. Was ist denn an meinem ursprünglichen Aufruf falsch (diese Funktion gibt in anderen<br>
Anwendungen noch das richtige Ergebnis zurück)???<p>
<pre>
<b>FUNCTION</b> Get_UserName: string;
s: string[200];
i: cardinal;
begin
try
GetUserName(@s[1], i);
s[0]:= char(i);
result:= s;
except
result:= ''
end
end;
</pre>
Comment
-
Hallo,
Windows arbeitet mit den sogenannten <i>nullterminierten Strings</i>, d.h. die Stringlänge ergibt sich durch die erste (!) Fundstelle eines NULL-Zeichens (#0). In meinem Beispiel habe ich <b>FillChar</b> aufgerufen, um die Puffervariable vollständig mit NULL-Zeichen zu füllen. Wenn Windows nun zum Beispiel den Benutzernamen "Test" hineinkopiert, so ergibt sich das folgende Bild: <i>Test#0#0#0#0#0...</i>. Das Stringende (erste Position von #0) wird garantiert gefunden.
Wenn allerdings die Puffervariable als <i>String[200]</i> deklariert wird, handelt es sich <b>nicht</b> um einen ANSI-String, sondern um einen Pascal-String, bei dem die Länge im ersten Byte abgelegt wird - allerdings kennt Win32 keine Pascal-Strings, so dass Win32 darauf keine Rücksicht nimmt. Das Ergebnis hängt nun davon ab, welche <b>zufälligen</b> Zeichen sich beim Aufruf an dieser Speicherstelle der Puffervariable befinden.
In meinem Buch <i>Delphi Win32-Lösungen</i> befasst sich das komplette Kapitel 3 auf den Seiten 87 bis 113 mit diesem Thema.


Comment
Comment