AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi GetUserName -> Result=True aber GetLastError=203
Thema durchsuchen
Ansicht
Themen-Optionen

GetUserName -> Result=True aber GetLastError=203

Ein Thema von heri · begonnen am 3. Feb 2007 · letzter Beitrag vom 3. Feb 2007
Antwort Antwort
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#1

GetUserName -> Result=True aber GetLastError=203

  Alt 3. Feb 2007, 11:36
erst einmal: ich wünsche allen DP'lern einen wunderschönen Programmieralltag!

und jetzt zu meinem Problemchen:

ich setze die Funktion GetUserName ein und diese funktioniert auch:
Ich erhalte den richtigen Wert und das Result ist true - Juhe!

ABER: getLastError ist 203! (gemäss SDK: 'The system could not find the environment option that was entered.')

hmm, kann das bitte mal jemand von euch auch diesen Wert auslesen?
möchte wissen obs an meinem System liegt oder...
wer hat sonst eine Idee?

Thx a lot
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: GetUserName -> Result=True aber GetLastError=203

  Alt 3. Feb 2007, 11:47
Vielleicht wird einfach innerhalb dieser Funktion eine andere Funktion aufgerufen welche den Wert setzt.
Setzt du mit "SetLastError" den Fehler vorher auf 0? Wenn GetUserName erfolgreich war wird SetLastError nie aufgerufen und somit liefert GetLastError den Fehlercode zurück welcher schon vor dem Aufruf von GetUserName aktuell war.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: GetUserName -> Result=True aber GetLastError=203

  Alt 3. Feb 2007, 13:03
der Fehler passiert definitv in der Funktion vom Kernel

siehe Programmschnippsel:
Delphi-Quellcode:
function GetWinComputerName(var AComputername: String): Integer;
var
Size: DWORD;
Buffer: array [0..MAX_COMPUTERNAME_LENGTH] of Char;
begin
AComputername := '';

  Size := sizeof( Buffer );

  setLastError(0);
  if Windows.GetComputerName(Buffer, Size) then
  begin

     if Size>1 then
     begin
        SetString(AComputername, Buffer, Size);
        Result := S_OK;
     end
     else
        Result := S_False;

  end
  else
     Result := GetLastError;

end;
...
funktioniert das bei Euch ohne LastError, oder ist es wie ich es vermute? (WinXP 2002 SP2)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: GetUserName -> Result=True aber GetLastError=203

  Alt 3. Feb 2007, 13:05
Geht es dir jetzt um die Funktion GetUserName oder GetComputerName? Bei GetUserName wird bei mir im Erfolgsfall der Wert von GetLastError nicht geändert.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: GetUserName -> Result=True aber GetLastError=203

  Alt 3. Feb 2007, 14:09
Zitat von SirThornberry:
Geht es dir jetzt um die Funktion GetUserName oder GetComputerName? Bei GetUserName wird bei mir im Erfolgsfall der Wert von GetLastError nicht geändert.
Eigentlich ändert keine WinAPI-Funktion den Wert von GetLastError.

GetLastError gibt ja den letzten Fehler und nicht den Status des letzten Funktionsaufrufs zurück ... der FehlerCode wird also nur geändert, wenn ein Fehler auftritt.

Wenn man GetLastError auch nach einem erfolgreichem Funktionsaufruf dennoch auslesen will, dann muß man GetLastError auch vor dem Funktionsaufruf aufrufen, da GetLastError den FehlerCode zurücksetzt.

Delphi-Quellcode:
GetLastError; // FehlerCode zurücksetzen
... // irgend'ne WinAPI-Finktion aufrufen
Result := GetLastError;
[add]
oder
Delphi-Quellcode:
SetLastError(0); // FehlerCode zurücksetzen
... // irgend'ne WinAPI-Finktion aufrufen
Result := GetLastError;
$2B or not $2B
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: GetUserName -> Result=True aber GetLastError=203

  Alt 3. Feb 2007, 14:15
Moin Heri,

bei mir liefert GetLastError zwar auch 203, aber Du versuchst Da ein Problem zu lösen, das nicht existiert:
GetLastError hat nur dann eine Bedeutung, wenn der Aufruf von GetComputername fehlschlägt.

@Himitsu:
Zitat von Himitsu:
da GetLastError den FehlerCode zurücksetzt.
das tut SetLastError(0) auch.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: GetUserName -> Result=True aber GetLastError=203

  Alt 3. Feb 2007, 15:52
sorry, es geht bei diesem Problem um die Funktion getComputerName (und - für alle die es interessiert - ebenfalls getComputerNameEx mit dem gleichen Fehlercode)

(habe mich in meiner Verwirrung wohl in der Beschreibung etwas vertan - getUserName funktioniert !),

doch ich bin jetzt schonmal froh, dass ich nicht der einzige bin, der diesen Fehlercode zurückerhält.

aber für mich ist es etwas unlogisch, dass ich einen Fehlercode erhalte - der Result der Funktion aber True ist
(ist das nicht ein Widerspruch - in der SDK steht.... naja, lassen wir das) :gruebel:

und "ja" - du hast ja Recht - "versuche nicht ein Problem zu lösen das nicht existiert"
"setze den Fehlercode nach dem Aufruf auf 0 und weiter gehts..."

werde ich machen - aber es ist doch schon seltsam - nicht wahr?

doch vielen dank fürs feedback!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: GetUserName -> Result=True aber GetLastError=203

  Alt 3. Feb 2007, 16:00
Ich finde das nicht selstam. Schließlich kann GetComputerName intern auch andere Funktionen aufrufen welche einen Fehler verursachen können bzw. einen Fehlercode zurück geben. Dieser spielt aber keine Rolle wenn GetComputerName True zurück gibt. Im Fall das GetComputerName False zurück gibt setzt diese Funktion dann auch den richtigen Fehlercode was so aber irrelevant ist.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: GetUserName -> Result=True aber GetLastError=203

  Alt 3. Feb 2007, 17:26
Es könnte sein, dass der Wert von GetLastError undefiniert ist, wenn die letzte API Funktion erfolgreich war. AHm, aber das kann auch nicht sein, denn dann wäre der Wert von GetLastError ERROR_SUCCESS. Jedenfalls besteht kein Grund GetLastError zu püfen, wenn die Funktion erfolgreich war.

Eventuell sollte man es so machen:
Delphi-Quellcode:
function ComputerName(var CompName: String): DWORD;
var
  len: Cardinal;
begin
  SetLength(CompName, MAX_COMPUTERNAME_LENGTH);
  if GetComputerName(PChar(CompName), len) then
  begin
    SetLength(CompName, len);
    result := ERROR_SUCCESS;
  end
  else
    result := GetLastError;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ret: DWORD;
  s: String;
begin
  ret := ComputerName(s);
  if ret = 0 then
    ShowMessage(s)
  else
    ShowMessage(SysErrorMessage(ret));
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:50 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