Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi GetUserName -> Result=True aber GetLastError=203 (https://www.delphipraxis.net/85688-getusername-result%3Dtrue-aber-getlasterror%3D203.html)

heri 3. Feb 2007 10:36


GetUserName -> Result=True aber GetLastError=203
 
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

SirThornberry 3. Feb 2007 10:47

Re: GetUserName -> Result=True aber GetLastError=203
 
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.

heri 3. Feb 2007 12:03

Re: GetUserName -> Result=True aber GetLastError=203
 
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)

SirThornberry 3. Feb 2007 12:05

Re: GetUserName -> Result=True aber GetLastError=203
 
Geht es dir jetzt um die Funktion GetUserName oder GetComputerName? Bei GetUserName wird bei mir im Erfolgsfall der Wert von GetLastError nicht geändert.

himitsu 3. Feb 2007 13:09

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

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;

Christian Seehase 3. Feb 2007 13:15

Re: GetUserName -> Result=True aber GetLastError=203
 
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:

Zitat von Himitsu
da GetLastError den FehlerCode zurücksetzt.

das tut SetLastError(0) auch. ;-)

heri 3. Feb 2007 14:52

Re: GetUserName -> Result=True aber GetLastError=203
 
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!

SirThornberry 3. Feb 2007 15:00

Re: GetUserName -> Result=True aber GetLastError=203
 
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.

Luckie 3. Feb 2007 16:26

Re: GetUserName -> Result=True aber GetLastError=203
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 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