JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=90b4a566983f9f80208ef9a4d54a0f2fMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Fehlermeldung beim Schließen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 21.03.2003, 13:11    Titel: Fehlermeldung beim Schließen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 21.03.2003, 13:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 21.03.2003, 15:40    Titel: Antworten mit Zitat

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

  1. eine Fehlermeldung ausgegeben
  2. 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Starwash
Senior JLI'ler


Alter: 40
Anmeldedatum: 22.09.2002
Beiträge: 252
Wohnort: Zossen (bei Berlin)
Medaillen: Keine

BeitragVerfasst am: 21.03.2003, 16:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 22.03.2003, 19:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DarK
Super JLI'ler



Anmeldedatum: 23.07.2002
Beiträge: 452
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 22.03.2003, 23:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 23.03.2003, 11:36    Titel: Antworten mit Zitat

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 Question 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 23.03.2003, 11:55    Titel: Antworten mit Zitat

Das mit dem Releasen steht auf Seite 297. Achte auf die Reihenfolge, in der du die Sachen released!
_________________
www.messiahzone.de.vu
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 23.03.2003, 14:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 23.03.2003, 15:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 28.03.2003, 17:14    Titel: Antworten mit Zitat

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 Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum