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 |
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. |
Re: GetUserName -> Result=True aber GetLastError=203
der Fehler passiert definitv in der Funktion vom Kernel
siehe Programmschnippsel:
Delphi-Quellcode:
funktioniert das bei Euch ohne LastError, oder ist es wie ich es vermute? (WinXP 2002 SP2)
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; ... |
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.
|
Re: GetUserName -> Result=True aber GetLastError=203
Zitat:
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:
[add]
GetLastError; // FehlerCode zurücksetzen
... // irgend'ne WinAPI-Finktion aufrufen Result := GetLastError; oder
Delphi-Quellcode:
SetLastError(0); // FehlerCode zurücksetzen
... // irgend'ne WinAPI-Finktion aufrufen Result := GetLastError; |
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:
|
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! |
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.
|
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