Abstürze beim Benutzen von Dateien



  • Hi, ich hab eine kleine Anwendung geschrieben
    oder besser gesagt: Es versucht
    Das einzige Problem ist was ich habe
    1. Zeilenumbrüche allgemein
    2. Abstürze in meinem Programm unter dem Menüpunkt: Datei->Verewigen (case 2)
    Meistens laufen diese Abstürze bei WriteFile, CreateFile oder manchmal auch einfach so bei lstrcat ab.
    Ohne viel zu labern, hier der Code, ich denke es ist offensichtlich was ich machen möchte (eine Art Gästebuch, was selbst auf Netzwerkebene funktionieren soll und das selbst ohne sockets, hier nicht abgebildet, nur WM_COMMAND)

    case WM_COMMAND:
    			if (HIWORD(wParam) == 0) // wenn Menü
    			{
    				switch (LOWORD(wParam))
    				{
    				case 1: // Datei->Neu
    					char *EditString;
    					char *a;
    
    					EditString = new char[512];
    					ZeroMemory(EditString, sizeof(EditString));
    
    					a = new char[3];
    					ZeroMemory(EditString, sizeof(a));
    					a[0] = 0x0d; // Zeilenumbruch: 0d0a
    					a[1] = 0x0a;
    
    					lstrcpy(EditString, "Name: ");
    					lstrcat(EditString, a);
    					lstrcat(EditString, "Das hab ich zu sagen: ");
    					SetWindowText(hEdit, EditString);
    
    					delete[] EditString;
    					delete[] a;
    					return 0;
    
    				case 2: // Datei->Verewigen
    					HANDLE hFile;
    					LONG FileSize;
    					char *FileText;
    					char *neu;
    					DWORD Readd;
    
    					hFile = CreateFile(DATEINAME, GENERIC_WRITE,
    						FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
    
    					if (hFile == INVALID_HANDLE_VALUE)
    						{
    							MessageBox(hWnd, "Kein GB Zugriff!", "Error!",
    								MB_ICONEXCLAMATION | MB_OK);
    							return 0;
    						}
    
    					SetFilePointer(hFile, 0, NULL, FILE_END);
    
    					FileText = new char[GetWindowTextLength(hEdit)+20];
    					ZeroMemory(FileText, sizeof(FileText));
    
    					neu = new char[10];
    					ZeroMemory(neu, sizeof(neu));
    
    					a = new char[3];
    					ZeroMemory(a, sizeof(a));
    
    					a[0] = 0x0d;
    					a[1] = 0x0a;
    
    					lstrcat(neu, a);
    					lstrcat(neu, "---");
    					lstrcat(neu, a);
    
    					GetWindowText(hEdit, FileText, GetWindowTextLength(hEdit)+1);
    					lstrcat(FileText, neu);
    
    					if (WriteFile(hFile, FileText, sizeof(FileText), &Readd, NULL) == 0)
    					{
    						MessageBox(hWnd, "Speicherung fehlgeschlagen!",
    							"Error!", MB_ICONEXCLAMATION|MB_OK);
    						return 0;
    					}
    
    					CloseHandle(hFile);
    
    					delete[] FileText;
    					delete[] neu;
    					delete[] a;
    					return 0;
    
    				case 3: // Datei->Lesen
    					hFile = CreateFile(DATEINAME, GENERIC_READ, FILE_SHARE_READ, NULL,
    						OPEN_EXISTING, NULL, NULL);
    					if (hFile == INVALID_HANDLE_VALUE)
    						{
    							MessageBox(hWnd, "Kein GB Zugriff!", "Error!",
    								MB_ICONEXCLAMATION | MB_OK);
    							return 0;
    						}
    
    					FileSize = GetFileSize(hFile, NULL);
    
    					FileText = new char[FileSize+1];
    					ZeroMemory(FileText, sizeof(FileText));
    
    					ReadFile(hFile, FileText, sizeof(FileText), &Readd, NULL);
    					CloseHandle(hFile);
    					SetWindowText(hEdit, FileText);
    					delete[] FileText;
    					return 0;
    
    				case 4: // Datei->Beenden
    					PostQuitMessage(0);
    					return 0;
    				}
    			}
    			return 0;
    

    Bitte helft, ich bin neu im Bereich WinApi und jetzt fängt es schon so an 😞



  • 1.) char *a = "\r\n"; 🙄
    2.) Bist du mal mit dem Debugger drüber gegangen?



  • 1. Bei SetWindowText zeigt er mir folgendes an:

    Name: ÍÍÍýýýý
    Das hab ich zu sagen:

    Gelöst damit:

    a = new char[3];
    ZeroMemory(EditString, sizeof(a));
    lstrcat(a, "\r\n");
    

    😞

    2. Debuggen, wie gesagt, mal hier mal da bei Datei-Zugriffen Probleme, aber eines kommt immer:
    Debug Error!
    Program: D:\...pfad...\winapi1.exe
    DAMAGE: after Normal block (#45) at 0x00861E40

    Was heisst das?

    P.S. Argh, 1. Fehler gefunden:

    ZeroMemory(EditString, sizeof(a));
    ZeroMemory(a, sizeof(a));
    

    P.P.S.
    Ok, debuggt, jetzt springt er schon beim 1. case raus (Datei->Neu)
    In der 3. Zeile von:

    lstrcpy(EditString, "Name: ");
    lstrcat(EditString, a);
    lstrcat(EditString, "Das hab ich zu sagen: ");
    


  • HAR schrieb:

    a = new char[3]; 
                        ZeroMemory(EditString, sizeof(a)); 
                        a[0] = 0x0d; // Zeilenumbruch: 0d0a 
                        a[1] = 0x0a; 
                                             
                        lstrcpy(EditString, "Name: "); 
                        lstrcat(EditString, a); 
                        lstrcat(EditString, "Das hab ich zu sagen: "); 
                        SetWindowText(hEdit, EditString); 
     
                        delete[] EditString; 
                        delete[] a;
    

    warum machst du das nicht einfach so:

    SetWindowText(hEdit, "Name: \r\nDas hab ich zu sagen: ");
    

    🙄

    HAR schrieb:

    neu = new char[10]; 
                        ZeroMemory(neu, sizeof(neu)); 
     
                         
                        a = new char[3]; 
                        ZeroMemory(a, sizeof(a)); 
     
                        a[0] = 0x0d; 
                        a[1] = 0x0a; 
                         
     
                        lstrcat(neu, a); 
                        lstrcat(neu, "---"); 
                        lstrcat(neu, a);
    

    Du musst nicht für jeden Zeilenumbruch eine Variable erstellen. Machs so:

    TCHAR neu[] = TEXT("\r\n---\r\n");
    

    Du solltest wohl besser erst mal C++ lernen, bevor du dich mit Windows-Programmierung beschäftigst.



  • Ok, ich habs jetzt abgeändert, mein Problem ist jetzt, dass die Daten nicht richtig abgepseichert werden und wenn ich die Datei z.B. im Editor öffne und editiere und danach mit meinem Programm öffne bekomme ich keine Zeilenumbrüche angezeigt und am Ende der Datei, wo eigentlich gar nichts sein soll, stehen wirre Zeichen wie

    xxxNÍÍÍÍýýýý

    obowhl im Notepad-Editor nur

    xxxName

    zu sehen ist!
    😕



  • Dann hast du wohl einen String nicht richtig terminiert (bzw. vorher nicht genullt) 😉



  • DWORD FileSize;
    HANDLE hFile;
    DWORD Readd;
    char *FileText;
    
    hFile = CreateFile(DATEINAME, GENERIC_READ, FILE_SHARE_READ, NULL,
    						OPEN_EXISTING, NULL, NULL);
    
    if (hFile == INVALID_HANDLE_VALUE)
    	return 0;
    
    FileSize = GetFileSize(hFile, NULL);
    
    FileText = new char[FileSize+1];
    ZeroMemory(FileText, sizeof(FileText));
    /// Hier wichtig denke ich
    ReadFile(hFile, FileText, sizeof(FileSize), &Readd, NULL);
    /// Hier wichtig denke ich
    CloseHandle(hFile);
    SetWindowText(hEdit, FileText);
    delete[] FileText;
    return 0;
    

    Hier irgendwelche logischen Fehler?



  • FileText = new char[FileSize+1]; 
    ZeroMemory(FileText, sizeof(FileText)); 
    /// Hier wichtig denke ich 
    ReadFile(hFile, FileText, sizeof(FileSize), &Readd, NULL);
    

    sizeof(FileText) ist immer 4, da FileText kein Array sondern ein Zeiger ist. Nimm FileSize + 1 als Größe.

    Bei ReadFile solltest du auch besser FileSize anstelle sizeof(FileSize) nehmen.

    Programmierst du eigentlich C oder C++?



  • C natürlich



  • new und delete gibt es bei C aber nicht.

    Du brauchst malloc und free:

    char* Buffer = malloc(FileSize); /* ! KEIN CAST ! also nicht: Buffer = (char*)malloc(FileSize) */
    
    /* ... */
    
    free(Buffer);
    

Anmelden zum Antworten