Download failed?

pepsi_gx

Erfahrenes Mitglied
Morgen Forum,

ein komisses Problem habe ich. Ich möchte in einem Programm eine Htmlseite downloaden, nach einer Weile(z.B. 2 Sec.) dann noch mal. Da auf der Htmlseite bestimmte Werte stehen und sich dynamisch echtzeitlich ändern, möchte ich diese Werte aus den zwei von mir heruntergeladenen Htmlseiten vergleichen.

Hier den Pseudo-Code:
C++:
int main(int argc, char* argv[])
{
char url[100];
char filename1[100], filename2[100];
string cmpParOld, cmpParNew;

strcpy(url, "http://xxx.xx.x.x/xxxxx");
strcpy(filename1, "d:\\downloadfile1.htm"); 

//die Funktion lädt die Htmlseite vom Url herunter
DownloadHtml(url, filename1);

//die Funktion sucht in heruntergeladener Datei nach dem Suchwert	
cmpParOld = Func_Strstr(filename1, "Suchwert");

cout << "Now waiting for 2 Sec." << endl;
Sleep(2000);
	
strcpy(filename2, "d:\\downloadfile2.htm");
DownloadHtml(url, filename2);
cmpParNew = Func_Strstr(filename2, "Suchwert");

if(cmpParNew != cmpParOld)
{
	......
}
}

Dann sehe ich, daß die Werte immer identisch sind! Doch wenn ich zweimal den URL aufrufe, sehe ich schon unterschiedliche Werte bei jedem Mal Aufruf.

Wo und was habe ich falsch gemacht?

*LG*
 
Hallo,

ich vermute mal, du verwendest "URLDownloadToFile". Das Problem hier ist, dass die Daten auch aus dem Cache geladen werden können. Nimm daher stattdessen lieber "URLDownloadToCacheFile". Der Unterschied in der Verwendung besteht darin, dass der Dateiname automatisch erzeugt und über einen Parameter zurückgegeben wird.
C++:
char cFile[MAX_PATH];
     
HRESULT hr = URLDownloadToCacheFile( NULL,
                                    "http://xxxx",
                                     cFile,
                                     MAX_PATH,
                                     0,
                                     NULL);
 
if( hr == S_OK )
{
    // ...
}
Gruß
MCoder
 
ich vermute mal, du verwendest "URLDownloadToFile". Das Problem hier ist, dass die Daten auch aus dem Cache geladen werden können.
Genau das wie du vermutest.

Der Unterschied in der Verwendung besteht darin, dass der Dateiname automatisch erzeugt und über einen Parameter zurückgegeben wird.
Was liefert URLDownloadToCacheFile dann zurück? Nur das "result"? Und wie kann ich auf die heruntergeladene Datei zugreifen?
 
C++:
char cFile[MAX_PATH];
     
HRESULT hr = URLDownloadToCacheFile( NULL,
                                    "http://xxxx",
                                     cFile,
                                     MAX_PATH,
                                     0,
                                     NULL);
Liefert URLDownloadToCacheFile "cFile" zurück? Wenn ja, dann kann man den Dateinamen zum Download nicht vorher angeben, oder?
Ich habe meine DownloadHtml Funktion umgeschrieben:
C++:
string DownloadHtml(char* URL)
{
    char cFile[MAX_PATH];
     
    HRESULT hr = URLDownloadToCacheFile( NULL,
                                     URL,
                                     cFile,
                                     MAX_PATH,
                                     0,
                                     NULL);
    string f(cFile);
    switch(result)
    {
                     case S_OK: return f; break; 
	case E_OUTOFMEMORY: cout << "Out of Memory\n" << endl; return "NULL"; break; 
	case INET_E_DOWNLOAD_FAILURE: cout << "Download failure\n" << endl; return "NULL"; break;
	case INET_E_RESOURCE_NOT_FOUND: cout << "URL not found!\n" << endl; return "NULL"; break;	
    }
}
So ist sie korrekt?
 
Nachdem ich "URLDownloadToCacheFile" ausprobiert habe, kriege ich immer noch das selbe Problem, also die Funktion lädt vom selben URL zweimal Dateien herunter aber die sind immer noch identisch.:confused:
 
Hi.

Wie bereits gesagt ist das Problem, das der Download gecached wird. Da hilft es auch nichts explizit die Datei im Cache zu speichern. Sowohl URLDownloadToFile, als auch URLDownloadToCacheFile laden die Daten nicht unbedingt neu runter.

Die zweite Funktion ist nur schöner, weil du dir da um die temporäre Speicherung keine Gedanken machen mußt.

Um einen Reload zu erzwingen mußt du den Cache-Eintrag explizit löschen: DeleteUrlCacheEntry

Gruß
 
Um einen Reload zu erzwingen mußt du den Cache-Eintrag explizit löschen: DeleteUrlCacheEntry

OK, hier das Zitat von MS:

MSDN hat gesagt.:
DeleteUrlCacheEntry Function

Removes the file associated with the source name from the cache, if the file exists.
C++:
BOOLAPI DeleteUrlCacheEntry(
  __in  LPCTSTR lpszUrlName
);

Parameters
lpszUrlName [in]
Pointer to a string that contains the name of the source that corresponds to the cache entry.

Return Value
Returns TRUE if successful, or FALSE otherwise. To get extended error information, call GetLastError. Possible error values include the following.

Danach vielleicht so?
C++:
...
string str1=DownloadHtml(URL);
DeleteUrlCacheEntry(Cachename);
string str2=DownloadHtml(URL);
...

Oder lieber soll in der Funktion "DownloadHtml" diese "DeleteUrlCacheEntry" aufrufen?
 
Zuletzt bearbeitet:
Ich hab diese "Delete" Funktion zwischen den beiden "Download" Funktionen hineingestellt und hab folgende Fehler bekommen:

Error 5 error LNK2019: unresolved external symbol "extern "C" int __stdcall DeleteUrlCacheEntry(char const *)" (?DeleteUrlCacheEntry@@$$J14YGHPBD@Z) referenced in function "int __cdecl main(int,char * * const)" (?main@@$$HYAHHQAPAD@Z)
Error 4 error LNK2028: unresolved token (0A000373) "extern "C" int __stdcall DeleteUrlCacheEntry(char const *)" (?DeleteUrlCacheEntry@@$$J14YGHPBD@Z) referenced in function "int __cdecl main(int,char * * const)" (?main@@$$HYAHHQAPAD@Z)
Error 6 fatal error LNK1120: 2 unresolved externals
 
Zurück