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 0x00861E40Was 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);