| 
			
				|  | JLI Spieleprogrammierung 
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| The Lord of Programming Living Legend
 
  
 Alter: 38
 Anmeldedatum: 14.03.2003
 Beiträge: 3122
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 21.03.2003, 13:11    Titel: Fehlermeldung beim Schließen |   |  
				| 
 |  
				| Hi Leute, 
 Ich hab n Programm geschrieben, bei dem immer beim Beenden eine Fehlermeldung auftritt:
 
  	  | Zitat: |  	  | Diese Anwendung wird aufgrund eines ungültigen Vorgangs geschlossen. | 
 
 Wenn ich dann auf Debug klicke springt der Debugger an die Stelle, an der der Hintergrundbuffer gelöscht und mit einer Farbe gefüllt wird. Und es kommt folgende Fehlermeldung:
 
  	  | Zitat: |  	  | Unbehandelte Ausnahme in Programm.exe: 0xC0000005: Access Violation.
 | 
 
 Hier ein paar Auszüge aus dem Programm. Vielleicht könnt ihr mir helfen:
 
  	  | Code: |  	  | while(TRUE) {
 if (PeekMessage(&Nachricht,NULL,0,0,PM_REMOVE))
 {
 if (Nachricht.message == WM_QUIT) break;
 // Nachricht an die Callbackfunktion senden
 TranslateMessage(&Nachricht);
 DispatchMessage(&Nachricht);
 }
 else
 {
 //sontiges
 }
 }
 | 
 
 
  	  | Code: |  	  | case WM_PAINT: DevCon=GetDC(hHauptfenster);
 PAINTSTRUCT ps;
 BeginPaint(hHauptfenster,&ps);
 Painting(DevCon);
 EndPaint(hHauptfenster,&ps);
 return 0;
 break;
 | 
 
 
  	  | Code: |  	  | void DirectDrawClass::Clear(int Farbe) {
 DDBLTFX BlitFX;
 ZeroMemory(&BlitFX,0);
 BlitFX.dwSize = sizeof(BlitFX);
 
 // Hintergrundfarbe setzen
 BlitFX.dwFillColor = Farbe;//Color;
 
 // Puffer löschen
 //----->Hier springt der Cursor beim Debuggen hin<-----
 DDHinterBuffer->Blt(NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&BlitFX);
 }
 | 
 _________________
 www.visualgamesentertainment.net
 Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
 (1) Realtime Developer Testing and Debugging Console
 
   Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
 Hilf Schäuble! Damit er auch was findet...
 |  |  
		| Nach oben |  |  
		|  |  
		| Christian Rousselle Site Admin
 
  
 Alter: 49
 Anmeldedatum: 19.07.2002
 Beiträge: 1630
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 21.03.2003, 13:51    Titel: |   |  
				| 
 |  
				| Hallo, 
 teste doch mal ob die Adresse, die in  DDHinterBuffer steht gültig ist.
 Z.B. mit 0 initialisieren und dann nach dem Anlegen des Buffers gucken, ob noch 0 drinsteht und was der Rückgabewert der Funktion ist, usw.
 
 Christian
 |  |  
		| Nach oben |  |  
		|  |  
		| The Lord of Programming Living Legend
 
  
 Alter: 38
 Anmeldedatum: 14.03.2003
 Beiträge: 3122
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 21.03.2003, 15:40    Titel: |   |  
				| 
 |  
				| DDHinterBuffer wird bereits im Konstruktor der DD-Klasse mit NULL initialisiert. Nach "GetAttachedSurface" wird geprüft, ob der Hintergrundbuffer tatsächlich angelegt werden konnte. Wenn nicht wird
 
 
 eine Fehlermeldung ausgegeben
in eine Logdatei, die alle Initialisierungen Dokumentiert, geschrieben, dass die Funktion fehlgeschlagen ist.
 
  	  | Code: |  	  | //Log-Eintrag GetAttachedSurface LogEintrag("008 GetAttachedSurface: ");
 
 // Hintergrundpuffer anlegen
 if(FAILED(DDPrimaereOberflaeche->GetAttachedSurface(&ddsd.ddsCaps,&DDHinterBuffer)))
 {
 Error("Fehler beim Anlegen des Buffers");
 LogTF(FALSE);
 //return FALSE;
 }
 else LogTF(TRUE);
 
 | 
 
 Beides ist nicht der Fall:
 Es tritt nur die oben genannte Fehlermeldung auf ^^.
 Die Logdatei enthält den Eintrag:
  	  | Zitat: |  	  | 008 GetAttachedSurface: erfolgreich | 
 
 Außerdem, das Zeichnen geht ja. Es wird alles schön in den Hintergrundbuffer geschrieben und dann geflippt.
 Und die Initialisierung des Buffers unterscheidet sich nicht von der anderer Spiele, die Funktionieren.
 _________________
 www.visualgamesentertainment.net
 Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
 (1) Realtime Developer Testing and Debugging Console
 
   Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
 Hilf Schäuble! Damit er auch was findet...
 |  |  
		| Nach oben |  |  
		|  |  
		| Starwash Senior JLI'ler
 
 
 Alter: 40
 Anmeldedatum: 22.09.2002
 Beiträge: 252
 Wohnort: Zossen (bei Berlin)
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 21.03.2003, 16:31    Titel: |   |  
				| 
 |  
				| Hi, debugge dein Programm doch mal von Anfang an bis du dann an die Stelle kommst, wo es sich aufhängt. Auf diese Weise solltest du wohl die Stelle finden an der mit einer Variable gearbeitet wurd, welche auf NULL zeigt. Ich weiß ja nicht, ob du Datei-Arbeit mit drin hast, aber fclose(...) kann zu abstürzen dieser Art führen, wenn der Zeiger auf die Datei NULL ist.
 
 Gruss Tarek
 |  |  
		| Nach oben |  |  
		|  |  
		| Jörg JLI MVP
 
  
  
 
 Anmeldedatum: 19.07.2002
 Beiträge: 182
 Wohnort: Siegen/NRW
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 22.03.2003, 19:42    Titel: |   |  
				| 
 |  
				| Die Tatsache, dass der Fehler beim Schließen des Programms auftritt, lässt mich vermuten, dass DDHinterBuffer Released und auf NULL gesetzt, danach aber nochmal Clear() aufgerufen ist. 
 Setz doch mal nen Breakpoint auf die Stelle, wo du DDHinterBuffer auf NULL setzt, bzw. SAFE_RELEASE(DDHinterBuffer) aufrufst, und falls das Programm dort anhält, bevor es in Clear() abstürzt, denke ich, dass oben geschilderter Fehler zutrifft.
 
 Jörg
 _________________
 www.messiahzone.de.vu
 |  |  
		| Nach oben |  |  
		|  |  
		| DarK Super JLI'ler
 
  
 
 Anmeldedatum: 23.07.2002
 Beiträge: 452
 Wohnort: NRW
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 22.03.2003, 23:43    Titel: |   |  
				| 
 |  
				| das Problem hatte ich vor kurzen noch , bei mir lag es daran das ich am schluss directdraw e.t.c. nicht wieder aufgereumt hatte... 
 also
 
 
  	  | Code: |  	  | if (lpDI != NULL) {
 lpDI->Release();
 lpDI = NULL;
 }
 
 | 
 
 e.t.c
 |  |  
		| Nach oben |  |  
		|  |  
		| The Lord of Programming Living Legend
 
  
 Alter: 38
 Anmeldedatum: 14.03.2003
 Beiträge: 3122
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 23.03.2003, 11:36    Titel: |   |  
				| 
 |  
				| Wenn ich das Programm durchkompilier dann komm ich irgendwann mal zu einer Fehlermeldung: 
  	  | Zitat: |  	  | Verfolgen innerhalb eines DLL Systems nicht erlaubt | 
 
 Primäreoberfläche und Objektzeiger werden erfolgreich released.
 
 @Jörg: muss man den Hintergrundbuffer überhaupt auf null setzen und releasen
  So weit ich weiß, stand davon nix in Christians Buch. _________________
 www.visualgamesentertainment.net
 Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
 (1) Realtime Developer Testing and Debugging Console
 
   Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
 Hilf Schäuble! Damit er auch was findet...
 |  |  
		| Nach oben |  |  
		|  |  
		| Jörg JLI MVP
 
  
  
 
 Anmeldedatum: 19.07.2002
 Beiträge: 182
 Wohnort: Siegen/NRW
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 23.03.2003, 11:55    Titel: |   |  
				| 
 |  
				| Das mit dem Releasen steht auf Seite 297. Achte auf die Reihenfolge, in der du die Sachen released! _________________
 www.messiahzone.de.vu
 |  |  
		| Nach oben |  |  
		|  |  
		| The Lord of Programming Living Legend
 
  
 Alter: 38
 Anmeldedatum: 14.03.2003
 Beiträge: 3122
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 23.03.2003, 14:45    Titel: |   |  
				| 
 |  
				|  	  | Zitat: |  	  | Da das DirectDraw-Objekt, der Clipper oder auch die primäre Oberfläche COM-Objekte sind, müssen diese wieder freigegeben werden, wenn die Anwendung beendet wird. Dazu muss die Methode Release des jeweiligen Objekts aufgerufen werden. 
 Für die Freigabe der DirectDraw-Objekte schreiben wir eine Funktion, die folgendermaßen aussieht:
 
  	  | Code: |  	  | // die Objekte freigeben void CleanupDirectDraw(void)
 {
 //Prüfen, ob die Zeiger gültig sind
 if(NULL!=lpDDSPrimary)
 {
 lpDDSPrimary->Release();
 lpDDSPrimary=NULL;
 }
 if(NULL!=lpDDClipper)
 {
 lpDDClipper->Release();
 lpDDClipper=NULL;
 }
 if(NULL!=lpDD7)
 {
 lpDD7->Release();
 lpDD7=NULL;
 }
 }
 | 
 | 
 
 Wo is n hier bitte der Hintergrundbuffer???
 Ich habs glaub ich scho bei anderen Spielen probiert mit
 
  	  | Code: |  	  | DDHinterbuffer->Release(); | 
 aber da gabs nur Fehlermeldungen.
 _________________
 www.visualgamesentertainment.net
 Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
 (1) Realtime Developer Testing and Debugging Console
 
   Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
 Hilf Schäuble! Damit er auch was findet...
 |  |  
		| Nach oben |  |  
		|  |  
		| Jörg JLI MVP
 
  
  
 
 Anmeldedatum: 19.07.2002
 Beiträge: 182
 Wohnort: Siegen/NRW
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 23.03.2003, 15:27    Titel: |   |  
				| 
 |  
				| Oh, du hast recht. Tut mir leid, da hab ich mich vertan. Aber prüf doch mal, ob Clear() aufgerufen wird, nachdem DirectDraw schon released wurde.
 _________________
 www.messiahzone.de.vu
 |  |  
		| Nach oben |  |  
		|  |  
		| The Lord of Programming Living Legend
 
  
 Alter: 38
 Anmeldedatum: 14.03.2003
 Beiträge: 3122
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 28.03.2003, 17:14    Titel: |   |  
				| 
 |  
				| Ich werd mal alle eure Möglichkeiten ausprobieren. Zur Zeit hab ich einfach viel mit meinem Fantasy-RPG zu tun.
 Wenns Probleme gibt, meld ich mich
  _________________
 www.visualgamesentertainment.net
 Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
 (1) Realtime Developer Testing and Debugging Console
 
   Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
 Hilf Schäuble! Damit er auch was findet...
 |  |  
		| Nach oben |  |  
		|  |  
		|  |  
  
	| 
 
 | Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten.
 Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
 Du kannst deine Beiträge in diesem Forum nicht löschen.
 Du kannst an Umfragen in diesem Forum nicht mitmachen.
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 Deutsche Übersetzung von phpBB.de
 |