Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Fehler bei Dateigröße über HTTP (WinINet) (https://www.delphipraxis.net/177562-fehler-bei-dateigroesse-ueber-http-wininet.html)

NickelM 13. Nov 2013 18:27

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:
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;
Der Witz ist, die Adresse stimmt, nur bei manchen kommt das diese Bedingung True ist warum?
Ich hab die Docu zu dieser Funktion X mal druchgelesen, wenn die Dateigröße stimmt, sollte es <> NO_ERROR sein, ist aber net. Warum?

himitsu 13. Nov 2013 18:47

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:

Zitat von Return value
If the function succeeds, it returns the current file position.
A return value of INVALID_SET_FILE_POINTER indicates a potential failure and needs to be followed by be a call to GetLastError.

Also nur wann sollst du in GetLastError nachsehen?


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.

NickelM 13. Nov 2013 21:13

AW: Fehler bei Dateigröße über HTTP (WinINet)
 
Zitat:

Zitat von himitsu (Beitrag 1235763)
Also nur wann sollst du in GetLastError nachsehen?

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 ...

Echt? D.h. das bei GestLastError unter umständen, ein Error von einer ganz anderen Funktion drin ist als der?
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.

himitsu 14. Nov 2013 08:40

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:
SetLastError(0);
(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)
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:42 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