DirectX Problem



  • Guten Tag^^

    Das ist mein Code:

    #include <d3d9.h>
    //-----------------------------------------------------------------------------
    LPDIRECT3D9 D3D = NULL;
    LPDIRECT3DDEVICE9 D3DDevice = NULL;
    D3DPRESENT_PARAMETERS Params;
    //-----------------------------------------------------------------------------
    struct SVertex
    {
    	D3DVECTOR vPosition;
    	DWORD dwColor;
    };
    //-----------------------------------------------------------------------------
    HRESULT InitD3D(HWND Fenster)
    {
    	D3D = Direct3DCreate9(D3D_SDK_VERSION);
    
    	ZeroMemory(&Params, sizeof(Params));
    	Params.Windowed = true;
    	Params.SwapEffect = D3DSWAPEFFECT_DISCARD;
    	Params.BackBufferFormat = D3DFMT_UNKNOWN;
    	Params.BackBufferCount = 1;
    	Params.hDeviceWindow = Fenster;
    
    	D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,Fenster,D3DCREATE_PUREDEVICE | D3DCREATE_HARDWARE_VERTEXPROCESSING,&Params,&D3DDevice);
    	D3D->Release();
    	D3DDevice->Release();
    
    	return 0;
    }
    //-----------------------------------------------------------------------------
    VOID Render()
    {
    	D3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,150),1.0f,0);
    
    	D3DDevice->BeginScene();
    	D3DDevice->EndScene();
    	D3DDevice->Present(NULL,NULL,NULL,NULL);
    }
    //-----------------------------------------------------------------------------
    VOID CLEAR()
    {
    	if(D3D != NULL)
    	{
    		D3D->Release();
    	}
    
    	if(D3DDevice != NULL)
    	{
    		D3DDevice->Release();
    	}
    }
    //-----------------------------------------------------------------------------
    LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
        switch( msg )
        {
            case WM_DESTROY:
                CLEAR();
                PostQuitMessage( 0 );
                return 0;
    		case WM_PAINT:
    			Render();
    			ValidateRect(hWnd,NULL);
    			return 0;
    	}
    
        return DefWindowProc( hWnd, msg, wParam, lParam );
    }
    //-----------------------------------------------------------------------------
    
    //-----------------------------------------------------------------------------
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
    {
        // Register the window class
        WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                          GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                          "D3D Tutorial", NULL };
        RegisterClassEx( &wc );
    
        // Create the application's window
        HWND hWnd = CreateWindow( "D3D Tutorial", NULL,
                                  WS_POPUPWINDOW, 0, 0, /*GetSystemMetrics(SM_CXSCREEN)*/250, /*GetSystemMetrics(SM_CYSCREEN)*/250,
                                  NULL, NULL, wc.hInstance, NULL );
    
        // Initialize Direct3D
        if( SUCCEEDED(( InitD3D(hWnd))))
        {
            {
                // Show the window
                ShowWindow( hWnd, SW_SHOWDEFAULT );
                UpdateWindow( hWnd );
    
                // Enter the message loop
                MSG msg;
                ZeroMemory( &msg, sizeof(msg) );
                while( msg.message != WM_QUIT )
                {
                    if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                    {
                        TranslateMessage( &msg );
                        DispatchMessage( &msg );
                    }
                }
        }
    
        UnregisterClass( "D3D Tutorial", wc.hInstance );
        return 0;
    }
    }
    

    Das "Gerüst" hab ich von einem Dx Tutorial...

    Wenn ich das ganze jetzt ausführe, bekomme ich ne MessageBox:

    Unbehandelte Ausnahme bei 0x00430a7a in Vertices.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xfeeeff9a.

    Das sagt mir garnichts...

    MfG



  • Dann ist es definitiv zu früh für dich mit einer Low-Level API arbeiten zu wollen.. 🙄

    Irgendetwas konnte nicht erstellt werden und es wird dann darauf zugegriffen.. Geh mal mit dem Debugger durch, dann findest du die Stelle.



  • HRESULT InitD3D(HWND Fenster) 
    { 
        D3D = Direct3DCreate9(D3D_SDK_VERSION); 
    
        ZeroMemory(&Params, sizeof(Params)); 
        Params.Windowed = true; 
        Params.SwapEffect = D3DSWAPEFFECT_DISCARD; 
        Params.BackBufferFormat = D3DFMT_UNKNOWN; 
        Params.BackBufferCount = 1; 
        Params.hDeviceWindow = Fenster; 
    
        D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,Fenster,D3DCREATE_PUREDEVICE | D3DCREATE_HARDWARE_VERTEXPROCESSING,&Params,&D3DDevice); 
        D3D->Release(); // WTF?
        D3DDevice->Release(); // WTF?
    
        return 0; 
    }
    

    lass mal die mit "WTF?" gekennzeichneten Zeilen raus.
    Die brauchst du da nicht und außerdem sind die da auch eher kontraproduktiv.

    MfG DrakoXP

    PS.: sowas gehört eher ins "Spieleprogrammierung"-Forum 😉
    DirectX gehört nicht gerade zu Standard-C++



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Okay, der Fehler steckt in:

    D3DDevice->Release();
    

    Hm...hast du ne Ahnung, was daran falsch ist ?

    Danke schonmal soweit.

    Edit:

    Hab das jetzt mal zum Testen umgewandelt:

    if(FAILED(D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,Fenster,D3DCREATE_PUREDEVICE | D3DCREATE_HARDWARE_VERTEXPROCESSING,&Params,&D3DDevice)))
    	{
    		D3D->Release();
    		MessageBox(NULL,"FAILED","Meldung",MB_OK);
    	}
    	else
    	{
    		D3D->Release();
    		D3DDevice->Release();
    		MessageBox(NULL,"ALLES OKAY","Meldung",MB_OK);
    	}
    

    Scheint ganz normal erzeugt worden zu sein, aber wenn Release() kommt, dann ist die Fehlermeldung wieder da....

    Edit II:

    Ich könnte mich gerade schon wieder killen, funktioniert jetzt, hab nur einen ziemlich blöden [anfänger] Fehler gemacht...
    Hab eine Funktion übersehen, in der die Schnittstelle auch Released wird -.-
    Trotzdem danke ! 😮 😮 😮



  • also wenn ich mich nicht irre ist Release() dazu da das DirectX Device wieder frei zu geben oO


Anmelden zum Antworten