unbehandelte ausnahme: zugriffsverletzung beim lesen an Position 0x00000000
-
Hi,
Ich versuche gerade bei mir DirectX zu initialisieren. Momentan hänge ich allerdings an einer Stelle fest und bekomme die obige Fehlermeldung. Hier einmal der Code:#include <iostream> #include <Windows.h> #include <assert.h> #include <xnamath.h> #include <D3D11.h> bool MSAA_4X = true; #define ReleaseCOM(x) { if(x){ x->Release(); x = 0; } } int mClientWidth = 1024; int mClientHeight = 1024; #define DEBUG using namespace std; int main() { if(!XMVerifyCPUSupport()) { cout << "ERROR: xna math not supported" << endl; return 0; } UINT createDeviceFlags = 0; #if defined(DEBUG) || defined(_DEBUG) createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; #endif D3D_FEATURE_LEVEL featureLevel; ID3D11Device* md3dDevice; ID3D11DeviceContext* md3dImmediateContext; HRESULT hr = D3D11CreateDevice ( 0, D3D_DRIVER_TYPE_HARDWARE, 0, createDeviceFlags, 0, 0, D3D11_SDK_VERSION, &md3dDevice, &featureLevel, &md3dImmediateContext ); if(FAILED(hr)) { MessageBox(0, L"D3D11CreateDevice Failed.", 0, 0); Sleep(5000); return 0; } if(featureLevel != D3D_FEATURE_LEVEL_11_0) { MessageBox(0, L"Direct3D Feature Level 11 unsupported.", 0, 0); Sleep(5000); return 0; } DXGI_SWAP_CHAIN_DESC sd; sd.BufferDesc.Width = mClientWidth; sd.BufferDesc.Height = mClientHeight; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; UINT MSAAQuality_4X; md3dDevice->CheckMultisampleQualityLevels(DXGI_FORMAT_R8G8B8A8_UNORM, 4, &MSAAQuality_4X); if(MSAA_4X) { sd.SampleDesc.Count = 4; sd.SampleDesc.Quality = MSAAQuality_4X - 1; } else { sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; } HWND mhMainWnd; UpdateWindow(mhMainWnd); sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.BufferCount = 1; sd.OutputWindow = mhMainWnd; sd.Windowed = true; sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; sd.Flags = 0; IDXGIDevice* dxgiDevice = 0; md3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice); IDXGIAdapter* dxgiAdapter = 0; dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&dxgiAdapter); IDXGIFactory* dxgiFactory = 0; dxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&dxgiFactory); IDXGISwapChain* mSwapChain; dxgiFactory->CreateSwapChain(md3dDevice, &sd, &mSwapChain); ReleaseCOM(dxgiDevice); ReleaseCOM(dxgiAdapter); ReleaseCOM(dxgiFactory); ID3D11RenderTargetView* mRenderTargetView; ID3D11Texture2D* backBuffer; mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&backBuffer)); md3dDevice->CreateRenderTargetView(backBuffer, 0, &mRenderTargetView); ReleaseCOM(backBuffer);
Der Fehler tritt in Zeile 126 auf. Ich hab schon alles Probiert was mir einfällt. Für eine Lösung wäre ich dankbar. Sollte jemand noch wissen ob die Objekt Initialisierung in Zeile 93/94 korrekt ist wäre das toll. Ich muss nämlich leider den Code aus dem Buch das ich habe, umschreiben um ihn verwenden zu können und dabei bin ich mir als relativer Neuling hier und da noch etwas unsicher. Sollte jemand noch was anderes ins Auge springen, nur Raus damit.
-
Das hört sich nach einem guten Zeitpunkt an, sich mit deinem Debugger anzufreunden.
-
Inwiefern kann ich den hier verwenden?
-
Und die Fehlermeldung deutet auf Dereferenzierung eines Nullzeigers hin. Sicher, dass die aufgerufenen Funktionen mit Nullzeigern klar kommen?
-
So wie ich das ganze verstehe übergebe ich nur einen Zeiger und der ist kein Nullzeiger. Er ist überhaupt nicht initialisiert. Die funktion initialisiert ihn indem sie einen Zeiger zurückgibt. So steht es zumindest in meinem Buch.
Edit:
Hier ist mal die definition der Funktion:
virtual HRESULT STDMETHODCALLTYPE GetBuffer(
/* [in] */ UINT Buffer,
/* [annotation][in] */
__in REFIID riid,
/* [annotation][out][in] */
__out void **ppSurface) = 0;
Vielleicht hilft euch das ja weiter.
-
Du überprüfst ja gar nicht, ob die Funktionen erfolgreich waren. Wie wär's mit Rückgabewerte überprüfen? Oo
-
Denk dran, ich hab ziemlich wenig Erfahrung. Wie kann ich den Rückgabewert überprüfen, wo doch der Compiler das Programm bei der Ausführung der Funktion anhält?
-
Neo234 schrieb:
Denk dran, ich hab ziemlich wenig Erfahrung. Wie kann ich den Rückgabewert überprüfen, wo doch der Compiler das Programm bei der Ausführung der Funktion anhält?
dir fehlt so viel vom grundlegenden verständnis, dass directx sicher nicht das richtige einstiegsgebiet für dich ist. versuch dich besser an einfachereren aufgaben, die dir die grundlagen besser vermitteln. zum beispiel die unterschiede zwischen compiler, debugger und betriebssystem. das ist zwar nicht so spannend wie pixel auf dem bildschirm zu zaubern, aber letzten endes zielführender als dein vorgehen.
-
Neo234 schrieb:
Denk dran, ich hab ziemlich wenig Erfahrung. Wie kann ich den Rückgabewert überprüfen, wo doch der Compiler das Programm bei der Ausführung der Funktion anhält?
Du solltest jeden Aufruf prüfen, in deinem Fall insbesondere den:
dxgiFactory->CreateSwapChain(md3dDevice, &sd, &mSwapChain);
da mSwapChain in Zeile 126 vermutlich 0 ist.
-
Ich habe alles zu den Grundlagen gelesen was ich kriegen konnte. Mir fehlt nur Erfahrung. Mag sein das DirectX schwierig ist, aber genau dafür habe ich ja ein Buch das mir das ganze erklärt. Anfangsschwierigkeiten hätte ich egal mit was ich Anfange. Ich denke das ich die Hauptunterschiede zwischen Compiler, Debugger und Betriebssystem verstanden habe. Soviel lässt sich da auch kaum falsch verstehen.
@manni66
Das ist mal ein guter Ansatz. Vielen Dank.
-
Dann sollte dir auch klar sein, wie man den Rückgabewert einer Funktion überprüft. Dein DirectX Buch sollte das im Übrigen auch machen.
-
Neo234 schrieb:
Ich denke das ich die Hauptunterschiede zwischen Compiler, Debugger und Betriebssystem verstanden habe. Soviel lässt sich da auch kaum falsch verstehen.
ok, aber...
Neo234 schrieb:
wo doch der Compiler das Programm bei der Ausführung der Funktion anhält?
anscheinend doch.