![]() |
Fehler bei Dateigröße über HTTP (WinINet)
Hallo zusammen,
Ich habe einen "kleinen" Patcher programmiert, der funkt soweit gut, nur wenn ihr mehrer Leute benutzen, kommen sie alle den gleichen Fehler und ich verstehe nicht warum, da dieser Fehler nur bei manchen User auftritt, die Anwendung ist NonVCL und verbindung über WinINet. Hier der entsprechende Code:
Delphi-Quellcode:
Der Witz ist, die Adresse stimmt, nur bei manchen kommt das diese Bedingung True ist warum?
var DownloadFileSize : LARGE_INTEGER;
Agent := InternetOpen('Darikon_Patcher',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0); UrlCon := InternetOpenUrl(Agent,PChar(DownloadURL),nil,0, INTERNET_FLAG_RELOAD,0); if UrlCon = nil then begin Result := URL_NOT_FOUND; Exit; end; If GetLastError = ERROR_FILE_NOT_FOUND then begin Result := URL_NOT_FOUND; Exit; end; try DownloadFileSize.LowPart := InternetSetFilePointer(UrlCon,0,@DownloadFileSize.HighPart,FILE_END,0); if GetLastError <> NO_ERROR then //Diese Bedingung ist manchmal True, dürft nicht sein oder? begin Result := GET_SIZE_ERROR; Exit; end; Ich hab die Docu zu dieser Funktion X mal druchgelesen, wenn die Dateigröße stimmt, sollte es <> NO_ERROR sein, ist aber net. Warum? |
AW: Fehler bei Dateigröße über HTTP (WinINet)
Ich hab nur mal kurz in die Doku geguckt und den Part kopiert, wo ich mir fast sicher war, daß er drinsteht.
Zitat:
GetLastError <> gib mir den FehlerAusführungscode des letzten Funktionsaufrufes. GetLastError = gib mit den Fehlercode, welchen irgendeine Funktion als Leztes zurückgegeben hat. Und das kann auch die vorletze Funktion sein, oder die davor ... PS: Die ersten beiden IFs könnte man auch zusammenfassen, da sie ja das Selbe machen. PPS: Bist du dir sicher, daß der Code jemals bei ERROR_FILE_NOT_FOUND ankommt? Wenn es nciht gefunden wurde, dann sollte dich bestimmt schon bei nil Schluß sein. Und genauso wie der NO_ERROR-Fehler, sollst du GetLastError auch da nur bei einem Fehler auslesen, also bei nur nil. |
AW: Fehler bei Dateigröße über HTTP (WinINet)
Zitat:
Also muss ich erst auf INVALID_SET_FILE_POINTER testen und dann auf GetLastError, bzw. GetLastError liefert mir nur dann den Fehler von dieser Funktion, wenn Result = INVALID_SET_FILE_POINTER ist? Zugegeben das musste ich jetzt nicht, ich dachte das GetLastError sich immer ändert, egal welche WinAPI aufgerufen wird. Gut ich änder das mal, d.h. das GetLastError mir unter umständen irgendwas anderes geliefert hat, das damit nichts zutun hat. |
AW: Fehler bei Dateigröße über HTTP (WinINet)
Jupp, genau das heißt es.
"Ursprünglich" wird SetLastError nur verwendet, wenn man einen Fehler rausgeben will, aber wenn es erfolgreich war, ist das ja nicht nötig. GetLastError ändert sich zwar (manchmal) auch bei Funktionen, die erfolgreich waren. 1: z.B. durch den Aufruf von
Delphi-Quellcode:
(ich hab schon gesehn, daß Einige diesen Aufruf vor Funktionen schreiben und danach dann via GetLastError prüfen, aber das kann auch schief gehn, siehe #3)
SetLastError(0);
2: wenn eine Funktion intern andere Funktionen aufruft, die einen Fehler via GetLastError liefern, dann steht in GetLastError natürlich auch deren Fehlercode drin, selbst wenn die Funtion erfolgreich waren 3: wenn eine Funktion kein SetLastError aufruft, z.B. weil die Funktion erfolgreich war, dann steht natürlich noch der Wert eines vorherrigen Aufrufs drin. Darum steht da ja auch immer, wie man einen Fehler erkennt (hier INVALID_SET_FILE_POINTER) und wie man detailiertere Informationen bekommt (hier GetLastError). Bei ShellExecute steht z.B. der Fehlercode nicht im GetLastError, sondern im Result und auf einen Fehler prüft man da mit <=32. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz