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