Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.08.2012, 19:06

Zugriffsverletzung beim Lesen an Position 0x00000000

Hallo,
ich habe schon wieder ein Problem:
Wenn ich DirectX im Fullscreen Modus Initialisiere, bekomme ich einen Fehler:
"Unbehandelte Ausnahme bei 0x00b11956 in zombieGame.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000."
Das ist der Quellcode der Datei wo der Fehler auftritt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "engine.h"
//#include <d3d9.h>
//#include <d3dx9.h>

const char* FileName  = "resouces/fighter_top.png";

CDirect3D::CDirect3D()
{
    m_lpD3D     = NULL;
    m_lpD3DFont = NULL;
    m_lpD3DDevice  = NULL;
}

CDirect3D::~CDirect3D()
{
    CleanUp();
}

BOOL CDirect3D::Init(HWND hWnd, BOOL bWindowed){
    //direct3d object erzeugen
    m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);

    if(m_lpD3D == NULL)
    {
        return FALSE;
    }

    //parameter fuer den modus festlegen
    D3DPRESENT_PARAMETERS PParams;
    ZeroMemory(&PParams, sizeof(PParams));

    PParams.SwapEffect          = D3DSWAPEFFECT_DISCARD;
    PParams.hDeviceWindow       = hWnd;
    PParams.Windowed            = bWindowed;

    PParams.BackBufferWidth     = 1000;
    PParams.BackBufferHeight    = 800;
    PParams.BackBufferFormat    = D3DFMT_A8R8G8B8;

    //Direct3D-Geraet anlegen
    if(FAILED(m_lpD3D->CreateDevice(
                D3DADAPTER_DEFAULT,
                D3DDEVTYPE_HAL,
                hWnd,
                D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                &PParams,
                &m_lpD3DDevice)))
    {
        return FALSE;
    }

    CreateFont();
    
    D3DXGetImageInfoFromFile(FileName, &m_SrcInfo);
 
    //offscreen surface erstellen
    m_lpD3DDevice->CreateOffscreenPlainSurface(m_SrcInfo.Width,
                                               m_SrcInfo.Height,
                                               D3DFMT_A8R8G8B8,
                                               D3DPOOL_DEFAULT,
                                               &m_lpSurface,
                                               NULL);

    D3DXLoadSurfaceFromFile(m_lpSurface,
                            NULL,
                            NULL,
                            FileName,
                            NULL,
                            D3DX_FILTER_NONE,
                            0,
                            NULL);

    //zeiger auf backbuffer bekommen
    m_lpD3DDevice->GetBackBuffer(0,0,
                                 D3DBACKBUFFER_TYPE_MONO,
                                 &m_lpBackBuffer);

    return TRUE;
}

void CDirect3D::BeginScene(void){
    m_lpD3DDevice->Clear(0,0,
                         D3DCLEAR_TARGET,
                         m_clearColor,
                         0, 0);//<---- Hier Zeigt ein Pfeil hin!

    m_lpD3DDevice->BeginScene();
}

void CDirect3D::EndScene(void){
    m_lpD3DDevice->EndScene();
    m_lpD3DDevice->Present(0,0,0,0);
}

// [...]


Wenn ich es nicht im Fullscreen Modus starte habe ich keine Fehler und alles funktioniert ohne Probleme. Wenn ich die Clear Methode und die BeginScene und EndScene Methode nicht aufrufe sehe ich nur das Fenster aber nichts ist im Fullscreen Modus und das Fenster ist auch nur weiß. Lasse ich nur die Clear Methode weg zeigt der Pfeil auf die nächste Zeile, also die BeginScene Methode

Ich verstehe nicht, wieso es aufeinmal nicht funktioniert, obwohl ich nur TRUE auf FALSE bei PParams.Windowed geändert habe.

MfG
MazzMan
Hi

2

26.08.2012, 19:23

Die größe des Backbuffers muss im Fullscreen Bildschirm von der Grafikkarte unterstützt werden. 1000x800 ist mir keine bekannte Bildschirmauflösung. Ändere das mal in 1024x768 oder so um.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

26.08.2012, 19:56

Funktioniert dein CDirect3D::Init() überhaupt? Ich vermute mal m_lpD3DDevice ist NULL.

Btw: Für das, was dein Init() da macht, ist wohl eigentlich der Konstruktor da... ;)

4

26.08.2012, 20:19

Viele Dank! Ich wusste schon nicht mehr was ich machen sollte. Es lag an der Auflösung! Jetzt Geht es! Danke.

@dot
mag zwar sein, aber ich finde es so ganz gut :)
vllt. ändere ich es ja noch im laufe der zeit
Hi

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

27.08.2012, 07:31

Viele Dank! Ich wusste schon nicht mehr was ich machen sollte. Es lag an der Auflösung! Jetzt Geht es! Danke


So einen Fehler sollte dein Programm erkennen. Du scheinst in 'Init' ja schon zu prüfen ob CreateDevice fehlschlägt. Wieso ziehst du das dann nicht konsequent weiter und prüfst ob 'Init' FALSE liefert. Wenn dem so ist kannst du das Programm z.B. (mit einem Fehler) beenden. Außerdem solltest du an potentiell riskanten Stellen (wie dieser in 'BeginScene') ebenfalls Tests durchführen. Falls du dir das if (!m_lpD3DDevice) ... sparen willst dann solltest du doch zumindest ein assert an die Stelle packen (das wird im Release komplett entfernt) um im Debug-Build eine halbwegs anständige Fehlerbeschreibung zu bekommen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void CDirect3D::BeginScene(void){
    assert(0 != m_lpD3DDevice && "device not initialized"); /// <-- so, oder ähnlich
    m_lpD3DDevice->Clear(0,0,
                         D3DCLEAR_TARGET,
                         m_clearColor,
                         0, 0);//<---- Hier Zeigt ein Pfeil hin!

    m_lpD3DDevice->BeginScene();
}
@D13_Dreinig

Werbeanzeige