Problem mit Release() eines PrimarySurface



  • Hi
    ich bin gerade dabei ein Klassenkonzept um DirectX zu schreiben. Bin nun bei den Surfaces angelangt. Funktioniert auch alles, solange ich keine Palette einsetze. Wenn ich aber eine Palette an mein PrimarySurface anhänge, bekomme ich beim Release() am Ende des Programms eine Exception. Jetzt weiß ich allerdings nicht, was diese Exception auslöst...
    Hier mal mein Code:

    // in der Header Datei:
    class CPalette
    {
    public:
        // random colors:
        CPalette(CDraw7Main& main, int flags = DDPCAPS_8BIT | DDPCAPS_ALLOW256 |
                                                DDPCAPS_INITIALIZE);
        CPalette(CDraw7Main& main, vector<PALETTEENTRY>& pal, int flags = DDPCAPS_8BIT | 
                                                                         DDPCAPS_ALLOW256 |
                                                                         DDPCAPS_INITIALIZE);
        ~CPalette();
        const LPDIRECTDRAWPALETTE  GetLPPalette() const {return lpddpal;}
    private:
        vector<PALETTEENTRY> palette;
        LPDIRECTDRAWPALETTE  lpddpal;
    };
    
    class CSurface
    {
    public:
    	virtual ~CSurface();
    protected:
    	CSurface() {}
    	LPDIRECTDRAWSURFACE7 lpsurface;
    	DDSURFACEDESC2 ddsd;
    	int width;
    	int height;
    	int bits;
    private:
    
    };
    
    class CPrimarySurface : public CSurface
    {
    public:
    	CPrimarySurface(CDraw7Main& Main);
    	CPrimarySurface(CDraw7Main& Main, CPalette& Palette);
    	virtual ~CPrimarySurface();
    private:
    
    };
    
    // in der cpp datei:
    CPrimarySurface::CPrimarySurface(CDraw7Main &Main)
    {
    	lpsurface = 0;
    	width = Main.GetWidth();
    	height = Main.GetHeight();
    	bits = Main.GetBits();
    	SecureZeroMemory(&ddsd,sizeof(ddsd)); // oder sizeof(DDSURFACEDESC2)
    	ddsd.dwSize = sizeof(ddsd);
    	ddsd.dwFlags = DDSD_CAPS;
    	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
    	if (FAILED(Main.GetDraw()->CreateSurface(&ddsd,&lpsurface,0)))
    		throw CException("Fehler bei PrimarySurface");
    }
    
    CPrimarySurface::CPrimarySurface(CDraw7Main& Main, CPalette& Palette)
    {
    	CPrimarySurface::CPrimarySurface(Main);
    	if ((lpsurface)&&(bits == 8)) 
    		if (FAILED(lpsurface->SetPalette(Palette.GetLPPalette())))
    			throw CException("Fehler bei Einsetzen der Palette in Primarysurface");
    }
    
    CSurface::~CSurface()
    {
    	if (lpsurface)
    		lpsurface->Release();/* hier wird die Exception angezeigt!!! ( hab das ganze auch schon im 
    Destruktor der abgeleiteten Klasse gemacht, hat aber auch nix gebracht)*/
    }
    
    //und Aufrufe etc. :
    CDraw7Main * Main = 0;
    CPalette * Palette = 0;
    CSurface * PrimarySurface = 0;
    
    std::vector<PALETTEENTRY> Pal;
    // Pal wird gefüllt
    try
    {
        Main = new CDraw7Main(hwnd,1024,768,8);
        Palette = new CPalette(*Main,Pal);
    	PrimarySurface = new CPrimarySurface(*Main, *Palette);
    }
    catch //.... eigene Exceptionklasse etc.
    
    // while etc.
    
    delete Palette; // Reihenfolge hier wurde schon getauscht ohne Erfolg
    delete PrimarySurface;
    delete Main;
    

    Der Code ist leider etwas mächtig, da ich nicht genau weiß, woran es jetzt genau liegt. Und ob es ein DirectX Problem oder ein C++ Problem ist.
    Hoffe ihr könnt mir weiterhelfen. Denn eigentlich ist das der gleiche Code, wie er in Tricks of the Windows Game Programming Gurus steht, nur halt mit Klassenkonzept drumrum.
    Danke schön!!!



  • Hallo,
    hab jetzt probiert, die Palette sozusagen wieder herauszunehmen vor dem Release, indem ich SetPalette mit 0 als Parameter aufgerufen habe. Dann wird die Exception schon bei diesem Aufruf ausgelöst.
    Also stimmt anscheinend etwas mit dem Surfacepointer nicht. Und da es nur auftritt, wenn ich eine Palette einsetze, muss es mit dem SetPalette im Konstruktor oder so zusammenhängen...
    Hoffe ihr könnt mir helfen!



  • Hi
    ich hab den Fehler gefunden, allerdings keine Ahnung wie ich es sauber machen kann. Es lag wohl an folgendem Aufruf:

    CPrimarySurface::CPrimarySurface(CDraw7Main& Main, CPalette& Palette)
    {
    	CPrimarySurface::CPrimarySurface(Main);// dadurch wird lpsurface wieder zerstört oder so?!?
    	if ((lpsurface)&&(bits == 8)) 
    		if (FAILED(lpsurface->SetPalette(Palette.GetLPPalette())))
    			throw CException("Fehler bei Einsetzen der Palette in Primarysurface");
    }
    

    Wenn ich den Code aus dem Konstruktor mit nur einem Argument in diesen Konstruktor oben kopiere, funktioniert alles. Wie kann ich also den Konstruktor mit einem Argument in dem mit zwei Argumenten aufrufen, sodass ich keinen doppelten Code habe? Brauche ich dazu eine neue Funktion oder geht das auch irgendwie anders.
    Scheint wohl eher ein C++ Problem zu sein, also könnte man den Thread vielleicht in das Forum verschieben oder so?


Anmelden zum Antworten