[DirectDraw] Absturtz am Ende des Programmes
-
Hallo.
Also ich arbeite grade an einer class für DirectDraw, also mit Initialisierung usw.
Soweit funktionert das auch alles. Allerdings stürtzt das Programm, sofern ich DirectDraw im Vollbildmodus starte, immer am Ende (vmtl beim Releasen der Surfaces) ab.Außerdem kann ich, wenn ich DirectDraw im Fenster starte, keine Farben im Fenster also z.B. einzelne Pixel "ausgeben". Das Fenster is dann immer Grau.
Wäre schön, wenn mir einer helfen könnte.
(PS: Habe schon ca. 2 stunden bei Google gesucht und nix gefunden.)
Hier der Code (Die main.cpp lasse ich jetzt weg, da die vmtl nicht nötig ist):
(Die vmtl wichtigen stellen sind mit einem "</////////////////" gekennzeichnet)
//Datei: DDNeu.h #include <windows.h> #include <iostream.h> #include <string.h> #include <ddraw.h> #ifndef _DDNeu #define _DDNeu class DirectDraw { private: int Breite, Hoehe, Bpp; LPDIRECTDRAW7 lpDD; LPDIRECTDRAWSURFACE7 lpDDSPrimary; LPDIRECTDRAWSURFACE7 lpDDSBack; LPDIRECTDRAWCLIPPER lpDDClipper; HRESULT ddrval; HWND hwnd; public: DirectDraw(HWND Hwnd ,int breite ,int hoehe ,int FulloderWind); LPDIRECTDRAWSURFACE7 GetPSurface(); LPDIRECTDRAWSURFACE7 GetBSurface(); bool DirectDrawIniFull(); <///////////////// bool DirectDrawIniWind(); <///////////////// bool PufferLeeren(LPDIRECTDRAWSURFACE7 lpDDSurf, UCHAR Farbe); bool PufferWechseln(); ~DirectDraw(); <///////////////// }; #endif
//Datei DDNeu.cpp #include "DDNeu.h" DirectDraw::DirectDraw(HWND Hwnd ,int breite ,int hoehe ,int FulloderWind) { hwnd = Hwnd; Breite = breite; Hoehe = hoehe; Bpp = 24; if(0 == FulloderWind) DirectDrawIniFull(); if(1 == FulloderWind) DirectDrawIniWind(); } LPDIRECTDRAWSURFACE7 DirectDraw::GetPSurface() { return lpDDSPrimary; } LPDIRECTDRAWSURFACE7 DirectDraw::GetBSurface() { return lpDDSBack; } bool DirectDraw::DirectDrawIniWind() <///////////////// { // Objekt erstellen ddrval=DirectDrawCreateEx(NULL,(LPVOID *)&lpDD,IID_IDirectDraw7,NULL); if(ddrval!=DD_OK) { MessageBox(hwnd, "DDraw ERROR: DirectDrawCreateEx()", "XXX", MB_OK); return(false); } // SetCooperativeLevel() ddrval=lpDD->SetCooperativeLevel(hwnd,DDSCL_NORMAL); if(ddrval!=DD_OK) { lpDD->Release(); MessageBox(hwnd, "DDraw ERROR: SetCooperativeLevel()", "XXX", MB_OK); return(false); } // Primary-Surface erzeugen DDSURFACEDESC2 ddsd; ZeroMemory(&ddsd,sizeof(ddsd)); ddsd.dwSize=sizeof(ddsd); ddsd.dwFlags=DDSD_CAPS; ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE; ddrval=lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL); if(ddrval!=DD_OK){ lpDD->Release(); MessageBox(hwnd, "DDraw ERROR: CreateSurface()", "XXX", MB_OK); return(false); } // Backbuffer erzeugen ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof( ddsd ); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwWidth = Breite; ddsd.dwHeight = Hoehe; ddrval=lpDD->CreateSurface(&ddsd,&lpDDSBack,NULL); if(ddrval!=DD_OK) { lpDD->Release(); lpDDSPrimary->Release(); MessageBox(hwnd, "DDraw ERROR: CreateSurface()", "XXX", MB_OK); return(false); } // Clipper erzeugen ddrval=lpDD->CreateClipper(0,&lpDDClipper,NULL); if(ddrval!=DD_OK) { lpDD->Release(); lpDDSPrimary->Release(); lpDDSBack->Release(); MessageBox(hwnd, "DDraw ERROR: CreateClipper()", "XXX", MB_OK); return(false); } // SetHwnd() ddrval=lpDDClipper->SetHWnd(0,hwnd); if(ddrval!=DD_OK){ lpDDClipper->Release(); lpDDSPrimary->Release(); lpDDSBack->Release(); lpDD->Release(); MessageBox(hwnd, "DDraw ERROR: SetHWnd()", "XXX", MB_OK); return(false); } // SetClipper() ddrval=lpDDSPrimary->SetClipper(lpDDClipper); if(ddrval!=DD_OK) { lpDDClipper->Release(); lpDDSPrimary->Release(); lpDDSBack->Release(); lpDD->Release(); MessageBox(hwnd, "DDraw ERROR: SetClipper()", "XXX", MB_OK); return(false); } PufferLeeren(lpDDSBack,25); return true; } bool DirectDraw::DirectDrawIniFull() <///////////////// { // Objekt erstellen HDC hdc; DDSURFACEDESC2 ddsd; // SurfaceBeschreibung DDSCAPS2 ddscaps; // Struktur ddrval = DirectDrawCreateEx(NULL, (LPVOID *)&lpDD, IID_IDirectDraw7, NULL); if(ddrval != DD_OK) { return false; MessageBox(hwnd, "DDraw ERROR: CreateEx()", "XXX", MB_OK); } ddrval = lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); if(ddrval != DD_OK) { lpDD->Release(); return false; MessageBox(hwnd, "DDraw ERROR: SetCooperativeLevel()", "XXX", MB_OK); } ddrval = lpDD->SetDisplayMode(Breite, Hoehe, Bpp, 0, 0); if(ddrval != DD_OK) { lpDD->Release(); return false; MessageBox(hwnd, "DDraw ERROR: SetDisplayMode()", "XXX", MB_OK); } ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; ddsd.dwBackBufferCount = 1; ddrval = lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL); if(ddrval != DD_OK) { lpDD->Release(); return false; MessageBox(hwnd, "DDraw ERROR: CreateSurface()", "XXX", MB_OK); } ZeroMemory(&ddscaps, sizeof(ddscaps)); ddscaps.dwCaps = DDSCAPS_BACKBUFFER; ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack); if(ddrval != DD_OK) { lpDD->Release(); lpDDSPrimary->Release(); lpDDSBack->Release(); return false; MessageBox(hwnd, "DDraw ERROR: GetAttachedSurface()", "XXX", MB_OK); } // Clipper erzeugen ddrval=lpDD->CreateClipper(0,&lpDDClipper,NULL); if(ddrval!=DD_OK) { lpDD->Release(); lpDDSPrimary->Release(); lpDDSBack->Release(); MessageBox(hwnd, "DDraw ERROR: CreateClipper()", "XXX", MB_OK); return(false); } // SetHwnd() ddrval=lpDDClipper->SetHWnd(0,hwnd); if(ddrval!=DD_OK){ lpDDClipper->Release(); lpDDSPrimary->Release(); lpDDSBack->Release(); lpDD->Release(); MessageBox(hwnd, "DDraw ERROR: SetHWnd()", "XXX", MB_OK); return(false); } // SetClipper() ddrval=lpDDSPrimary->SetClipper(lpDDClipper); if(ddrval!=DD_OK) { lpDDClipper->Release(); lpDDSPrimary->Release(); lpDDSBack->Release(); lpDD->Release(); MessageBox(hwnd, "DDraw ERROR: SetClipper()", "XXX", MB_OK); return(false); } PufferWechseln(); if(!PufferLeeren(lpDDSBack,0)) MessageBox(hwnd, "DDraw ERROR: PufferLeeren(lpDDSBack01)", "XXX", MB_OK); PufferWechseln(); if(!PufferLeeren(lpDDSBack,0)) MessageBox(hwnd, "DDraw ERROR: PufferLeeren(lpDDSBack02)", "XXX", MB_OK); return true; } bool DirectDraw::PufferLeeren(LPDIRECTDRAWSURFACE7 lpDDSurf, UCHAR Farbe) { DDBLTFX ddBltFx; ZeroMemory(&ddBltFx, sizeof(DDBLTFX)); ddBltFx.dwSize = sizeof(DDBLTFX); ddBltFx.dwFillColor = Farbe; ddrval = lpDDSurf->Blt(NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddBltFx); if(ddrval != DD_OK) { return 0; MessageBox(hwnd, "DDraw ERROR: Blt()", "XXX", MB_OK); } return true; } bool DirectDraw::PufferWechseln() { HRESULT ddrval; ddrval = lpDDSPrimary->Flip(NULL, DDFLIP_WAIT); if(ddrval == DD_OK) { return true; } else if(ddrval == DDERR_SURFACELOST) { ddrval = lpDDSPrimary->Restore(); if(ddrval != DD_OK) {return false; MessageBox(hwnd, "DDraw ERROR: Restore()", "XXX", MB_OK);} ddrval = lpDDSPrimary->Flip(NULL, DDFLIP_WAIT); if(ddrval != DD_OK) {return false; MessageBox(hwnd, "DDraw ERROR: FLip2()", "XXX", MB_OK);} return true; } return true; } DirectDraw::~DirectDraw() <///////////////// { if(lpDDSBack) { lpDDSBack->Release(); lpDDSBack=NULL; } if(lpDDSPrimary) { lpDDSPrimary->SetClipper(NULL); lpDDClipper=NULL; lpDDSPrimary->Release(); lpDDSPrimary=NULL; } if(lpDD) { lpDD->Release(); lpDD=NULL; } }
Schonmal Danke im vorhinein.
PS: Ich habe versucht mich deutlich auszudrücken und mein Proble zu schildern und erwarte auch halbwegs intelligente Antworten. Sollte dann noch etwas an Informationen fehlen, kann man ja nett fragen.
-
Nebenbei: Es erstaunt mich, dass heute doch noch recht viele
Leute DirectDraw benutzen. o.O@peterpanzki:
Was sagt denn der Debugger zur genauen Absturzstelle?
Oder gibt's da Probleme wegen Vollbild?Info:
ddrval = lpDDSPrimary->Restore(); if(ddrval != DD_OK) {return false; MessageBox(hwnd, "DDraw ERROR: Restore()", "XXX", MB_OK);}
Ist mir beim Überfliegen ein paar Mal aufgefallen... Dir ist bewusst,
dass die MessageBox niemals angezeigt wird, da Du die Funktion vorher
verlässt? Ist das Absicht?
-
1. Ne der debugger gibt überhaupt keine Fehler meldung aus, das Programm stürtzt ab sobald ich das beenden will. Also ich starte das und das geht auch alles prima, nur sobald ich das Programm beende stürtzt das ab
(... musste beendet werden ...).2. Doch die Fehlermeldung wird irgendwie trotzdem augegeben hatte ich schon öffters ma probiert. Mich hat das auch gewundert, aber es geht.
3. Jo! I-wo hast ja recht, ddraw is kagge, aber wer weis, ob man's net vll doch iwann ma braucht ^^
-
Nein, wird sie nicht. Kann sie garnicht. Das ist ein Ding der Unmöglichkeit, außer dein Compiler hat ne Macke. Fix die Ausgabe der Fehlermeldungen und schau, wann dir ne MessageBox gezeigt wird.
Ich schätze mal, irgendeine Funktion ab DirectDrawCreateEx wird Probleme machen und nicht wie gewünscht funktionieren und spätestens beim Release hauts das ganze Programm wegen der fehlerhaften Initialisierung weg.