Pobieranie plików z HTTP bez INDY a cache [SOLVED]

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Pobieranie plików z HTTP bez INDY a cache [SOLVED]

Nowy postprzez husky83 » niedziela, 21 czerwca 2009, 10:22

Witam,
BazujÄ…c na poradzie:

http://cyfbar.republika.pl/siec.html#siec14

chcę ściągnąć treść strony www
tak więc mam:
Kod: Zaznacz cały
AnsiString Url =  "http://cyfbar.republika.pl/index.html";
IStream* pStream;
Memo1->Clear();
URLOpenBlockingStream(0, Url.c_str(), &pStream, 0, 0);
std::auto_ptr<TOleStream> oStream(new TOleStream(pStream));
Memo1->Lines->LoadFromStream(oStream.get());


Wszystko działa przecudnie, ALE... funkcja pobierania strony ma być wywoływana cyklicznie (co kilkadziesiąt sekund), szukając zmian kilku rzeczy na stronie (mniejsza o szczegóły)... Problem polega na tym, że gdy po raz kolejny funkcja zostaje załadowana, pomimo zmian na stronie do Memo zostaje wczytany IDENTYCZNY tekst jak za pierwszym razem!!
Mało tego - jeśli usunę stronę z serwera, po wywołaniu funkcji NADAL jest wyświetlana zawartość strony !! Podejrzewam że pStream w jakiś sposób przechowuje pierwotną zawartość i nie ma zamiaru się jej pozbywać, stąd zawsze ta sama wartość :/ Proszę o pomoc :)
Ostatnio edytowano niedziela, 21 czerwca 2009, 11:40 przez husky83, Å‚Ä…cznie edytowano 2 razy
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
Kompilator: C++ Builder
    NieznanyNieznana

Re: Pobieranie plików z HTTP bez INDY

Nowy postprzez wargo » niedziela, 21 czerwca 2009, 10:39

Użyj:
Kod: Zaznacz cały
delete pStream;

po zakończeniu
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Pobieranie plików z HTTP bez INDY

Nowy postprzez husky83 » niedziela, 21 czerwca 2009, 10:44

Też tak myślałem, wcześniej już z tym próbowałem ale:
1. nic to nie daje - efekt ten sam :(
2. Program zawiesza siÄ™ po ok. minucie



EDIT:

dodałem teraz:
Kod: Zaznacz cały
URLDownloadToFile(0, main_url.c_str(), "TEsT", 0, 0);


(oczywiście w 'main_url' mam adres stronki)

i zrobiłem pewien test.. Uruchomiłem program, Został utworzony plik 'TEsT' zawierający kopie stronki z netu.. Co następnie zrobiłem:
- usunÄ…Å‚em plik TEsT
- zmieniłem zawartość strony
- kazałem programowi pobrać ponownie strone
- przeżyłem szok - funkcja URLDownloadToFile, pomimo że strona się zmieniła pobrała identyczną stronę jak na początku - jakby funkcje URLDownload* korzystały z jakiegoś cache...

Więc wina leży (prawdopodobnie) po stronie funkcji URLDownloadToFile, tudzież URLOpenBlockingStream. Raz wywołana funkcja tworzy cache, z którego potem pobiera zawartość (tak mi się wydaje)... Jak temu zapobiec?
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
Kompilator: C++ Builder
    NieznanyNieznana

Re: Pobieranie plików z HTTP bez INDY

Nowy postprzez husky83 » niedziela, 21 czerwca 2009, 11:39

ROZWIÄ„ZANIE PROBLEMU:

Kod: Zaznacz cały
#pragma comment(lib, "wininet.lib")


i przed wywołaniem funkcji URLDownloadToFile:
Kod: Zaznacz cały
DeleteUrlCacheEntry(main_url.c_str());


gdzie (AnsiString) main_url to adres stronki do której chcemy się odwołać.


Tak jak myślałem - plik był zapisywany do cache i w trakcie kolejnego odwołania był z niego odczytywany. Rozwiązanie więc banalnie proste - usunąć cache naszej stronki. A i nawet funkcja się do tego znalazła ;)
Całość wygląda zatem tak:
Kod: Zaznacz cały
AnsiString Url =  "http://cyfbar.republika.pl/index.html";   // Adres naszej stronki
IStream* pStream;
Memo1->Clear();
DeleteUrlCacheEntry(Url.c_str());    // Wyczyszczenie cache dla tego adresu
URLOpenBlockingStream(0, Url.c_str(), &pStream, 0, 0);  // pobranie stronki
std::auto_ptr<TOleStream> oStream(new TOleStream(pStream));
Memo1->Lines->LoadFromStream(oStream.get());




Można zamknąć i zostawić dla potomnych :)
Avatar użytkownika
husky83
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): czwartek, 26 marca 2009, 11:06
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
Kompilator: C++ Builder
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron