AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Fehler bei Dateigröße über HTTP (WinINet)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von NickelM · begonnen am 13. Nov 2013 · letzter Beitrag vom 14. Nov 2013
Antwort Antwort
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#1

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

  Alt 13. Nov 2013, 18:27
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?
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 13. Nov 2013, 18:47
Ich hab nur mal kurz in die Doku geguckt und den Part kopiert, wo ich mir fast sicher war, daß er drinsteht.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Nov 2013 um 18:55 Uhr)
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#3

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

  Alt 13. Nov 2013, 21:13
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.
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 14. Nov 2013, 08:40
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 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 09:19 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