Entwickler-Ecke
Internet / Netzwerk - Textdatei mit Get abfragen
Mathematiker - Fr 21.04.17 13:47
Titel: Textdatei mit Get abfragen
Hallo,
ich möchte von meiner Internetseite eine Textdatei mittels Get laden und auswerten.
Bis jetzt habe ich:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57:
| uses idhttp; function neueversion:boolean; var IdHTTP1 : TIdHTTP; buffer : array[0..50] of char; Mem : TMemoryStream; s,s2 : string; i : integer; function Sto_GetFmtFileVersion(const FileName: String;const Fmt: String): String; var iBufferSize: DWORD; iDummy: DWORD; pBuffer: Pointer; pFileInfo: Pointer; iVer: Array[1..4] of Word; begin Result := ''; iBufferSize := GetFileVersionInfoSize(PChar(FileName), iDummy); if (iBufferSize > 0) then begin GetMem(pBuffer, iBufferSize); try GetFileVersionInfo(PChar(FileName), 0, iBufferSize, pBuffer); VerQueryValue(pBuffer, '\', pFileInfo, iDummy); iVer[1] := HiWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionMS); iVer[2] := LoWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionMS); iVer[3] := HiWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS); iVer[4] := LoWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS); finally FreeMem(pBuffer); end; Result := Format(Fmt, [iVer[1], iVer[2], iVer[3], iVer[4]]); end; end; begin IdHTTP1:=tidhttp.create(nil); Mem := TMemoryStream.Create; try IdHttp1.Get('http://mathematikalpha.de/.../version.txt', Mem); mem.position:=0; mem.Read(buffer,20); i:=0; s:=''; repeat if buffer[i]<>#13 then s:=s+buffer[i]; inc(i); until buffer[i]=#13; s2:=Sto_GetFmtFileVersion(application.exename,'%d.%d.%d.%d'); neueversion:=(s<>s2); except on E: Exception do neueversion:=false; end; Mem.free; IdHTTP1.free; end; |
Ich habe es jetzt mehrfach getestet und weiß nicht, wo ein Fehler sein sollte.
Bei mir funktioniert es ohne jegliche Probleme, gleichgültig, ob die Strings s und s2 gleich oder verschieden sind oder ob eine Internetverbindung besteht oder nicht. Allerdings gilt das scheinbar nicht für andere Anwender.
Könnte jemand mal auf den Text schauen, ob ich einen Fehler/Denkfehler begangen habe.
Sollte meine "Lösung" sehr laienhaft sein, so bitte um Entschuldigung. Von diesem ganzen Internetkram habe ich praktisch keine Ahnung.
Danke
Steffen
Delphi-Laie - Fr 21.04.17 14:05
Auf meinen Webspace zugegriffen, funktioniert diese Funktion (eigentlich ein Pleonasmus). Evtl. hat es mit dem (verweigerten) Fremdzugriff auf Deinen Webspace zu tun.
Edit: Probiere mal:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57:
| function neueversion:boolean; var IdHTTP1 : TIdHTTP; buffer : array[0..50] of char; Mem : TMemoryStream; s,s2 : string; i : integer; function Sto_GetFmtFileVersion(const FileName: String;const Fmt: String): String; var iBufferSize: DWORD; iDummy: DWORD; pBuffer: Pointer; pFileInfo: Pointer; iVer: Array[1..4] of Word; begin Result := ''; iBufferSize := GetFileVersionInfoSize(PChar(FileName), iDummy); if (iBufferSize > 0) then begin GetMem(pBuffer, iBufferSize); try GetFileVersionInfo(PChar(FileName), 0, iBufferSize, pBuffer); VerQueryValue(pBuffer, '\', pFileInfo, iDummy); iVer[1] := HiWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionMS); iVer[2] := LoWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionMS); iVer[3] := HiWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS); iVer[4] := LoWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS); finally FreeMem(pBuffer); end; Result := Format(Fmt, [iVer[1], iVer[2], iVer[3], iVer[4]]); end; end; begin IdHTTP1:=tidhttp.create(nil); Mem := TMemoryStream.Create; try IdHttp1.Get('http://sortierkino.bplaced.net/test.txt',Mem); mem.position:=0; mem.Read(buffer,20); i:=0; s:=''; repeat if buffer[i]<>#13 then s:=s+buffer[i]; inc(i); until buffer[i]=#13; showmessage(s); s2:=Sto_GetFmtFileVersion(application.exename,'%d.%d.%d.%d'); neueversion:=(s<>s2); except on E: Exception do neueversion:=false; end; Mem.free; IdHTTP1.free; end; |
"Showmessaged" beim Aufruf "Hallo"?
Mathematiker - Fr 21.04.17 14:31
Delphi-Laie hat folgendes geschrieben : |
Edit: Probiere mal: ... |
Funktioniert problemlos.
Auch der Direktzugriff über den IE/Chrome funktioniert.
Steffen
PS.: Die direkte Adresse bei mir ist: 'http://mathematikalpha.de/wp-content/uploads/2017/04/version.txt'
Delphi-Laie - Fr 21.04.17 14:36
Mathematiker hat folgendes geschrieben : |
PS.: Die direkte Adresse bei mir ist: 'http://mathematikalpha.de/wp-content/uploads/2017/04/version.txt' |
Klare Ansage, so läßt sich das prüfen. Und es funktioniert (bei mir wenigstens).
Hm, sind wir jetzt mit unserem Latein am Ende? Hilfe, Experten!
Edit: Als Beweis hier der Inhalt Deiner Textdatei: 25.2017.4.1561
Edit 2: Na gut, das ist doch kein Beweis, denn man kann auch direkt vom Browser aus aufrufen.
Holgerx - Fr 21.04.17 15:29
Hmm..
Hab das auch getestet.
(Nur die Get-Routine etwas anders gemacht ;) )
und es läuft.
Angehängt ein kleines Testprogram
D6 mit Indy 10.6. + 32Bit SSL-Libs
Mathematiker - Fr 21.04.17 16:10
Holgerx hat folgendes geschrieben : |
Hab das auch getestet.
(Nur die Get-Routine etwas anders gemacht ;) )
und es läuft. |
Danke.
Wenn ich es richtig verstehe, sind die Unterschiede in deiner get-Variante die Verwendung der Stringliste, der evtl. Test auf den Userzugang sowie die hhtps-Möglichkeit.
D.h., vom Prinzip her ist meine einfache Lösung korrekt.
Verflixt noch mal, warum geht es dann nicht immer?
@Delphi-Laie: Ich habe einmal unter
http://mathematikalpha.de/wp-content/uploads/2017/04/matlex_test.zip
nur die Exe-Datei abgelegt. Wenn du diese in den Mathematik alpha-Ordner kopierst und aufrufst, kannst du noch bitte noch einmal testen, ob es die Probleme immer noch gibt.
Danke.
Steffen
PS: Datei wieder entfernt.
Delphi-Laie - Fr 21.04.17 16:36
So etwas in der Art schwebte mir auch schon vor, doch ich wagte es nicht, Dich mit einer solchen Extrawurst zu behelligen.
Leider habe ich mit dieser alternativen Exe-Datei aber immer noch den gleichen Fehler, den ich oben schon nannte.
Bin ich denn der einzige, der ihn bemängelt, oder haben andere auch schon etwas in diese Richtung vermeldet?
Edit: Wenn wir diesen Fehler finden wollen, müssen wir ihn einkreisen und die Schlinge enger ziehen. Demnach müßtest Du - da Du den Quelltext, jedenfalls den vollständigen, sicher nicht herausrücken möchtest - von der Matlex.exe wesentliche, d.h. urheberrechtlich relevante, für diesen Funktionalität aber irrelevante Teile "herausbrechen", evtl. bis zum eigentlichen Problem reduziert, um dann ggf. doch einen von Dir vertretbaren "Rumpfquelltext" zu veröffentlichen oder wengistens an meine Wenigkeit weiterzureichen.
Edit2: "Mein" Paradebeispiel einer solchen wochenlangen (!!) Detektivarbeit findet sich unter
http://www.enterag.ch/hartwig/bug/bug.html. Und der Fehler lag bei Borland...
Edit 3: Alternativ kannst Du auch in dieser o.g. Zugriffsfunktion zwischen jede Zeile ein showmessage mit einer aufsteigenden Nummer einfügen. Dann ließe sich die Befehlszeile, in der der Zugriffsfehler auftritt, vermutlich genau eingrenzen.
Mathematiker - Fr 21.04.17 18:40
Hallo Delphi-Laie,
Danke, aber ich lasse es jetzt erst einmal.
Ich werde noch einmal in Ruhe darüber nachdenken.
Steffen
Delphi-Laie - Fr 21.04.17 18:55
Yo, schlaf' mal eine Nacht darüber!
Aber Du solltest möglichst nicht verzagen, denn aufzugeben ist nun wahrlich nicht der Programmierer (ihr) Ding. Aktuelles Beispiel: Ich war auch den ganzen Nachmittag damit beschäftigt, einen Fehler zu suchen / finden. Obwohl ich alle Überprüfungen bei den Compileroptionen setzte, ist das Dekrement einer word-Variablen hinein ins "Pseudonegative" nicht angezeigt/moniert worden, also irgendwie "durchgerutscht". Leider war der dekrementierte Wert nicht nahe bei den verdächtigen 65536, sondern nur bei über 9000, und ich wundere mich einen Wolf. Da kommt Freude auf.
Wie gesagt, gib mir eine Exe-Datei, die die heikle Funktion "visuell durchsteppt", dann werden wir den Fehler zumindest weiter einkreisen. Mehr kann ich nun wirklich nicht anbieten.
Edit: Am nicht bemerkten Integerüberlauf lag es nun doch nicht...
Holgerx - Sa 22.04.17 10:31
Hmm..
Mal ne ganz andere Frage:
Verwenden die Anwender, bei denen es NICHT geht eventuell einen Proxy?
Dieser könnte eventuell eine Anmeldung vor dem Web-Zugriff benötigen ;)
Oder blockiert da die Windows-Firewall deine App ?
Wenn es bei Dir läuft, sollte es nicht an der Exe, sondern an der Umgebung liegen können.
Ich weiß nicht, ob die Proxy-Geschichte einfach min Indy umgesetzt werden könnten.. ;)
Delete - Sa 22.04.17 10:51
- Nachträglich durch die Entwickler-Ecke gelöscht -
Delphi-Laie - Sa 22.04.17 23:26
Holgerx hat folgendes geschrieben : |
Verwenden die Anwender, bei denen es NICHT geht eventuell einen Proxy? |
Ich? Nicht, daß ich wüßte, jedenfalls nicht explizit. Ich richtete nie einen ein. Wo sollte ich auch?!
Wenn es daran liegen sollte: Warum kann ich dann mit der o.g. Funktion auf meine und Mathematikers Textdatei zugreifen?
Holgerx hat folgendes geschrieben : |
Oder blockiert da die Windows-Firewall deine App ? |
Falls wiederum ich gemeint sein soll: Nein, solches halbausgegorenes Zeugs verwende ich nicht (mehr), dafür funktioniert diese zu unzuverlässig und unkomfortabel (zickte z.B. bei FTP-Zugriff, natürlich fand ich den Fehler nur durch Zufall und Spürsinn, wie käme denn diese Firewall dazu, eine aussagekräftige Fehlermeldung auszuspucken?!). Nur die "saubere" Firewall im Router nutze ich. Ohne eine solche geht es nicht. Ich hatte sie vor Jahren mal experimentalweise ausgeschaltet und hatte binnen 10 min ein völlig verseuchtes Windows (2000). Ich war mir unschlüssig, über wen ich mehr ärgerlich sein sollte: Über diese hochenergetisch-kriminellen Elemente des Internets oder über den Redmonder Schrott, der ohne einen solchen Schutz völlig wehrlos, splitternackt ist.
Ich bin weiterhin zur Hilfe bereit, jedoch nicht mehr dazu, mich weiter zu rechtfertigen oder an Ursachenspekulationen zu beteiligen und dafür Zeit zu verplempern (ich bin am Computer gern produktiver als auf diese Weise). So findet man keine Fehler! Entweder, Mathematiker macht einen Nagel mit Kopf und bestreitet die von mir vorgeschlagenen Wege (oder andere, womöglich noch wirksamere), die Wurzel des Übels einzugrenzen, oder eben nicht. Im letzteren Falle steht es frei, das Programm doch wieder mit dieser Funktionalität zu veröffentlichen und ggf. manche Nutzer mit dieser Fehlermeldung sozusagen in Kauf zu nehmen.
Proxy, Indy, meine Güte, hier werkeln Hobbyprogrammierer und in bezug auf Internetfunktionalität sogar lausige Amateure! Ich zähle mich jedenfalls dazu, und auch Mathematiker äußerte sich so.
Delete - So 23.04.17 10:20
- Nachträglich durch die Entwickler-Ecke gelöscht -
Delphi-Laie - So 23.04.17 10:26
Das Phänomen taucht bei mir auf Windows XP auf!
Edit: Das erklärt zudem nicht (zufridenstellend), warum die o.a. Funktion in der matlex.exe teiweise so umherzickt. Irgendetwas an ihrem "Umfeld" scheint zu stören. Derlei Fehler sind nunmal nur durch aufwendiges und systematisches Umzinglen zu lokalisieren, nicht jedoch durch Ursachenforschung über das Internet.
Delete - So 23.04.17 10:46
- Nachträglich durch die Entwickler-Ecke gelöscht -
Delphi-Laie - So 23.04.17 11:00
Frühlingsrolle hat folgendes geschrieben : |
Ich kann dir das wiedergeben, was Microsoft von sich gibt: Win32 1722 Fehler tritt mit dem Windows Installier auf. Warum? Tjaa ... |
Ist das jetzt ein Wink mit dem Zaunpfahl, oder rätselst Du selbst?
Ich wählte die installationsfreie Version des Mathematikalphas!
Für mich sind solche Fehler inzwischen fast schon reflexhaft bei fehlenden (also nichtgestarteten) Diensten ("RPC") zu suchen, da ich bei diesen immer ordentlich wegputze (ich entscheide lieber allein und reduziere die Redmonder Ressourcenverschwendung). Doch damit kam ich diesmal nicht weit(er).
Holgerx - So 23.04.17 15:32
Hmm..
@Delphi-Laie
Ich hab mich NICHT auf DICH bezogen, sondern auf:
Mathematiker hat folgendes geschrieben : |
Bei mir funktioniert es ohne jegliche Probleme, gleichgültig, ob die Strings s und s2 gleich oder verschieden sind oder ob eine Internetverbindung besteht oder nicht. Allerdings gilt das scheinbar nicht für andere Anwender.
|
Somit auf die Anwender unbekannterweise, welche hier gemeint waren...
Aus meiner Erfahrung bei Kunden, welche einen Proxy mit Anmeldung dazwischen geschaltet haben, könnte dies ein Grund darstellen, oder auch die z.B. bei Win7 / 8 / 10 automatisch vorhandene und aktivierte Firewall, welche ausgehende Verbindungen von ihm unbekannten Programmen blocken kann.
Auch kann ein Proxy zu einem Redirect führen, weshalb bei meinem obrigen Testtool auch
IdHTTP1.HandleRedirects := true;
gesetzt ist.
Ich gebe Frühlingsrolle allerdings recht, dass hier mal
IdHTTP1.ResponseCode
ausgewertet wird, dann wüssten wir weshalb die Datei nicht gelesen wird.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!