Aktualisierung über das Internet - Komisches (Fehl)verhalten des Programms...



  • Hallo Zusammen

    Ich lasse mir vom Internet ein Radarbild herunterladen, das GIF-Bild in einem Verzeichnis speichern. Dieses wird von dort ausgelesen und im Dialog angezeigt. Soweit so gut. Lösche ich das Bild und klicke nun auf "Update" lädt er erneut das Bild runter, so wie es sein muss. 😃

    Allerdings hab ich feststellen müssen, wenn der Loop im Internet (der Bild-Datei-Name ist noch immer gleich!) aktueller ist (bsp um 5 Minuten) und ich auf Update klicke, lädt er mir zwar das Bild erneut aus dem Internet, aber es ist und blibet noch immer das alte! 😮 (auch im Ordner selbst, nicht nur im Dialog).

    Daher frag ich mich, hab ich irgendwo was falsch deklariert??

    Am Anfang des Programms überprüfe ich den aktuellen Programmpfad, um dann die ini-Datei sowie den img-Temp Ordner zu erstellen, falls diese noch nicht vorhanden sind (beim ersten Programmstart).

    Sind im Ordner schon Bilder vorhanden werden diese angezeigt und sollten mit einem Klick auf "Update" aktualisiert werden (mit den neuen Bildern im Internet, name und URL bleiben aber gleich). Sind noch keine Bilder vorhanden, so werden diese frisch aus dem Netz geladen und angezeigt sowie im Ordner abgelegt.

    Hier der entsprechende Code:

    //Aktueller Programmpfad herausfinden (dort wo das Programm installiert worden ist!)
    	char buf[256];
    	GetModuleFileName(NULL, buf, 255);
    	strPfad.Format("%s", buf);
    	int nTmp = strPfad.ReverseFind('\\');
    	strPfad.Delete(nTmp,strPfad.GetLength()-nTmp);
    
    	//Überprüfen ob eine settings.ini vorhanden ist
    	if(!PathFileExists(strPfad+"\\settings.ini"))
    	{
    		//Wenn die Datei nicht gefunden wurde, neue erstellen
    		WritePrivateProfileString("General Settings", "PicturePath", strPfad+"\\tmp_img", strPfad+"\\settings.ini");
    		//Temp-Verzeichnis für die Bilder (Radar, usw.) erstellen
    		CreateDirectory(strPfad+"\\tmp_img", NULL);
    		//Info an User
    		MessageBox("Information an Benutzer, die das Programm zum ersten mal starten:\nDie zuletzt angezeigten Radar- und Informationsbilder werden im Ordner \"tmp_img\" abgelegt. Dieser Ordner befindet sich in "+strPfad, "Wichtiger Hinweis", MB_ICONINFORMATION | MB_OK);
    	}
    
    	//Bilder laden und anzeigen
    	char pPath[255]; 
    	GetPrivateProfileString("General Settings", "PicturePath", "C:\\Windows\\Temp",pPath,255,strPfad+"\\settings.ini");
    	m_strPath = pPath;
    	m_strPicPath_mc = m_strPath+"\\uwzch_small_white.jpg";
    	m_strPicPath_mr = m_strPath+"\\mcha_loop.gif";
    
    	//Prüfen ob die Bilder nicht schon vorhanden sind.
    	if(!PathFileExists(m_strPicPath_mc))
    	{
    
    		GetPicFromHTTP("http://www.unwetterzentrale.de/images/icons/uwzch_small_white.jpg", m_strPath);
    	//Meteocentrale laden und anzeigen
    	if (m_PictureMC.Load(_T(m_strPicPath_mc)))
        m_PictureMC.Draw();
    	}
    
    	else
    	{
    		//Meteocentrale laden und anzeigen
    	if (m_PictureMC.Load(_T(m_strPicPath_mc)))
        m_PictureMC.Draw();
    	}
    
    	if(!PathFileExists(m_strPicPath_mr))
    	{
    
    		GetPicFromHTTP("http://www.metradar.ch/2009/pc/mcha_loop.gif", m_strPath);
    	//Metradar Loop laden und anzeigen
    	if (m_PictureMR.Load(_T(m_strPicPath_mr)))
    	m_PictureMR.Draw();
    	}
    
    	else
    	{
    		//Metradar Loop laden und anzeigen
    	if (m_PictureMR.Load(_T(m_strPicPath_mr)))
    	m_PictureMR.Draw();
    	}
    
    	//Timer Starten (Um Bilder aus dem Internet zu aktualisieren)
    	//kommt später
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	// EXCEPTION: OCX Property Pages should return FALSE
    }
    
    void CHauptDlg::OnTimer(UINT_PTR nIDEvent)
    {
            //Später sollten die Bilder unabhängig voneinander aktualisiert werden
    	KillTimer(TRUE);
    	CDialog::OnTimer(nIDEvent);
    }
    
    void CHauptDlg::OnBnClickedButton1()
    {
    	// TODO: Add your control notification handler code here
    	GetPicFromHTTP("http://www.unwetterzentrale.de/images/icons/uwzch_small_white.jpg", m_strPath);
    	//Meteocentrale laden und anzeigen
    	if (m_PictureMC.Load(_T(m_strPicPath_mc)))
        m_PictureMC.Draw();
    	UpdateData(TRUE); //True funktioniert nicht
    }
    
    void CHauptDlg::OnBnClickedButton2()
    {
    	// TODO: Add your control notification handler code here
    	GetPicFromHTTP("http://www.metradar.ch/2009/pc/mcha_loop.gif", m_strPath);
    	//Metradar Loop laden und anzeigen
    	if (m_PictureMR.Load(_T(m_strPicPath_mr)))
    	m_PictureMR.Draw();
    	UpdateData(FALSE); //und das auch nicht
    }
    

    Ich frage mich wie ist das möglich?? Wenn man das alte Bild löscht und dann erneut eines heruntergalden wird dass es wieder das alte ist obwohl im Netz schon lange ein neues da ist ?? 😕 😕

    lg
    Wolf

    Das Proggy gibts hier: www.nfws.ch/SCMT.zip (751 KB) 👍 <-- Das Programm ist schon wieder andersrum gestaltet ohne "Update-Button".. aber das Problem ist noch immer da 🙂

    Viel Spass und Danke für die Hilfe und Hinweise (die später jetzt noch kommen und schon da sind).



  • Ich denke, da macht dir die Cache-Funktion einen Strich durch die Rechnung. Diese kann man deaktivieren, für genauere Angaben müsste man aber mal den Code von GetPicFromHTTP() kennen.



  • XMaster schrieb:

    Ich denke, da macht dir die Cache-Funktion einen Strich durch die Rechnung. Diese kann man deaktivieren, für genauere Angaben müsste man aber mal den Code von GetPicFromHTTP() kennen.

    Hm.. den Code von GetPicFromHTTP kann ich Dir gerne liefern.. (ist ein wenig länger, sorry) aber der sieht so aus:

    #include <afxinet.h>
    #include "HauptDlg.h"
    #pragma comment(lib, "wininet.lib") 
    
    #define SUCCESS 0
    #define INVALID_PATH 1
    #define ACCESS_DENIED 2
    #define DISK_FULL 3
    #define INVALID_URL 4
    #define FILE_NOT_FOUND 5
    
    int GetPicFromHTTP(CString strURL, CString strPathToSaveTo)
    {
        DWORD dwBuffer = 256;
        if(!InternetCanonicalizeUrl(strURL,strURL.GetBuffer(256), &dwBuffer,0))
        {
            strURL.ReleaseBuffer();
            return INVALID_URL;
        }
    
        strURL.ReleaseBuffer();
        CString strTmpURL = strURL;
        strTmpURL.MakeLower();
        if(strTmpURL.Find("http://")!=-1)
            strURL.Delete(0,7);
        CInternetSession INetSession;
        CHttpConnection *HTTPConn=NULL;
        CHttpFile *HTTPFile=NULL;
        TRY
        {
            HTTPConn=INetSession.GetHttpConnection(strURL.Mid(0,strURL.Find("/")));
            strURL.Delete(0,strURL.Find("/")+1);
            HTTPFile = HTTPConn->OpenRequest(CHttpConnection::HTTP_VERB_GET,strURL);
            HTTPFile->SendRequest();
        }
        CATCH(CInternetException, pEx)
        {
            HTTPFile->Close();
            HTTPConn->Close();
            INetSession.Close();
            delete HTTPFile;
            delete HTTPConn;
            return FILE_NOT_FOUND;
        }
        END_CATCH
    
        CString strMime;
        HTTPFile->QueryInfo(HTTP_QUERY_CONTENT_TYPE, strMime);
        if(strMime.Find("html")!=-1)
        {
            HTTPFile->Close();
            HTTPConn->Close();
            INetSession.Close();
            delete HTTPFile;
            delete HTTPConn;
            return FILE_NOT_FOUND;
        }
    
        CFile *pFile;
        if(strPathToSaveTo.Right(1)!='\\')
            strPathToSaveTo+="\\";    
        TRY
        {
            pFile = new CFile(strPathToSaveTo+strURL.Right(strURL.GetLength()-strURL.ReverseFind('/')), CFile::modeCreate | CFile::modeWrite);
        }
        CATCH(CFileException, pEx)
        {
            HTTPFile->Close();
            HTTPConn->Close();
            INetSession.Close();
            delete HTTPFile;
            delete HTTPConn;
            if(pEx->m_cause == CFileException::badPath)
                return INVALID_PATH;
            if(pEx->m_cause == CFileException::accessDenied)
                return ACCESS_DENIED;
            if(pEx->m_cause == CFileException::diskFull)
                return DISK_FULL;
        }
        END_CATCH
    
        char *chBuffer = new char[5*1024+1];
        int nRead = 0;
        while((nRead = HTTPFile->Read(chBuffer, 5*1024)))
        {
            chBuffer[nRead] = '\0';
            pFile->Write(chBuffer,nRead);
        }
        HTTPFile->Close();
        HTTPConn->Close();
        INetSession.Close();
        delete HTTPFile;
        delete HTTPConn;
        delete[] chBuffer;
        CString strBuffer;
        pFile->Close();
        pFile->Open(strPathToSaveTo+strURL.Right(strURL.GetLength()-strURL.ReverseFind('/')),CFile::modeRead);
        pFile->Read(strBuffer.GetBuffer(pFile->GetLength()), pFile->GetLength());
        pFile->Close();
        strBuffer.ReleaseBuffer();
        strBuffer.MakeLower();
        delete pFile;
        return SUCCESS;
    }
    

    lg
    Wlf



  • Probier mal, in CHttpConnection::OpenRequest() beim dwFlags-Parameter den Flag INTERNET_FLAG_RELOAD mitzugeben.

    Aber warum nimmst du nicht die praktische Funktion URLDownloadToFile (http://msdn.microsoft.com/en-us/library/ms775123%28VS.85%29.aspx), dann aber wieder in Verbindung mit DeleteUrlCacheEntry (http://msdn.microsoft.com/en-us/library/aa383983%28VS.85%29.aspx)?



  • XMaster schrieb:

    Probier mal, in CHttpConnection::OpenRequest() beim dwFlags-Parameter den Flag INTERNET_FLAG_RELOAD mitzugeben.

    Aber warum nimmst du nicht die praktische Funktion URLDownloadToFile (http://msdn.microsoft.com/en-us/library/ms775123%28VS.85%29.aspx), dann aber wieder in Verbindung mit DeleteUrlCacheEntry (http://msdn.microsoft.com/en-us/library/aa383983%28VS.85%29.aspx)?

    Ich hab die Klasse von Codeproject gedownloadet und eingebunden...

    Ich hab jetzt:

    HTTPFile = HTTPConn->OpenRequest(CHttpConnection::HTTP_VERB_GET | INTERNET_FLAG_RELOAD,strURL);
    

    Wenn ich aber auf den Update-Button klicke, der das MR Radarbild neu laden soll bekomm ich wegen dem INTERNET_FLAG_RELOAD folgender Abbruch mit der Meldung:

    Debug Assertion Failed! Inet.cpp, on Line 2055

    Why??
    Lg
    Wolf



  • Wolf1985 schrieb:

    Why??

    weil du nix kannst außer Copy & Paste'n. du hast nicht mal ahnung von den grundlagen der programmierung. was zweifelsfrei deine anderen threads hier beweisen. du beschäftigst dich mit 5 problemen auf einmal und kapierst nicht einmal den hintergrund der einzelnen programmcodes, geschweigedenn simple und einfache fehler, die du aus unwissenheit verbockst.

    lass es doch einfach sein die Community mit deinen banalen problemen zu beschäftigen, setzt dich hin und lern erst mal die grundlagen der programmierung. Selbst wenn du es schaffen solltest dein programm zum laufen zu bringen, so kannst du dir bestimmt NICHT auf die stirn schreiben, DAS DIES DEIN WERK IST. denn zur einen hälfte hat es Codeproject und zur anderen die Community von C++ geschrieben.

    :p



  • Kleiner Hinweis, sieh mal auf http://msdn.microsoft.com/en-us/library/b9zh7b56%28VS.80%29.aspx nach, welcher der von mir erwähnte dwFlags-Parameter ist. 🙂


  • Mod

    Why?? schrieb:

    Wolf1985 schrieb:

    Why??

    weil du nix kannst außer Copy & Paste'n.

    Aber heißt CPP nicht Copy Paste Programming? <duck&wech> 🤡


Anmelden zum Antworten