DirectX - D3D11CreateDeviceAndSwapChain verursacht Exception

10/29/2013 14:07 Mostey#1
Habe mir vor kurzem DirectX näher angeschaut und habe nun nach einem Tutorial mal die Init Funktion (grob, nur das wichtigste) geschrieben. Leider bekomme ich bei der Erstellung eine Exception die ich nicht entfernen kann. Vielleicht kennt sich hier ja jemand damit aus oder kann mir sagen, wie ich irgendwelche Debuginformationen da rausbekomme mit denen ich was anfangen kann.

Code:
// aus dem Header
private:
		IDXGISwapChain		*	m_SwapChain;
		ID3D11Device		*	m_Device;
		ID3D11DeviceContext *	m_DeviceContext;


// Funktion
bool CD3D::Initialize(HWND hWnd, unsigned int Height, unsigned int Width)
{
	DXGI_SWAP_CHAIN_DESC SwapChainDesc;
	HRESULT Result;

	SecureZeroMemory(&SwapChainDesc, sizeof(SwapChainDesc));
	
	
	SwapChainDesc.BufferCount = 1;
	SwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
	SwapChainDesc.BufferDesc.Height = Height;
	SwapChainDesc.BufferDesc.Width = Width;
	SwapChainDesc.Windowed = true;
	SwapChainDesc.SampleDesc.Count = 4;
	SwapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
	SwapChainDesc.OutputWindow = hWnd;
	SwapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;

	Result = D3D11CreateDeviceAndSwapChain	(NULL,
											D3D_DRIVER_TYPE_HARDWARE,
											NULL,
											NULL,
											NULL,
											NULL,
											D3D11_SDK_VERSION,
											&SwapChainDesc,
											&m_SwapChain,
											&m_Device,
											NULL,
											&m_DeviceContext);

	if(FAILED(Result)) return false;

	return true;
}
Sorry für die Formatierung bei der Funktion, sieht irgendwie bei mir in VS ganz anders aus. >.>
10/29/2013 14:46 XxharCs#2
Was für eine Exception bekommst du?

btw. Debug Info bekommen:
Code:
UINT createDeviceFlags = 0;

#ifdef _DEBUG
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

...
...
Result = D3D11CreateDeviceAndSwapChain (
    NULL,
    D3D_DRIVER_TYPE_HARDWARE,
    NULL,
    createDeviceFlags, // Für Debug Info
    NULL,
    NULL,
    D3D11_SDK_VERSION,
    &SwapChainDesc,
    &m_SwapChain,
    &m_Device,
    NULL,
    &m_DeviceContext);

if(FAILED(Result))
{
    SHOW_ERROR(Result);
    return Result;
}
10/29/2013 15:15 Mostey#3
Quote:
Originally Posted by XxharCs View Post
Was für eine Exception bekommst du?

btw. Debug Info bekommen:
Code:
UINT createDeviceFlags = 0;

#ifdef _DEBUG
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

...
...
Result = D3D11CreateDeviceAndSwapChain (
    NULL,
    D3D_DRIVER_TYPE_HARDWARE,
    NULL,
    createDeviceFlags, // Für Debug Info
    NULL,
    NULL,
    D3D11_SDK_VERSION,
    &SwapChainDesc,
    &m_SwapChain,
    &m_Device,
    NULL,
    &m_DeviceContext);

if(FAILED(Result))
{
    SHOW_ERROR(Result);
    return Result;
}
Die Funktion "SHOW_ERROR" gibt's nicht, braucht man dafür nen speziellen Header oder hast du die selbst geschrieben?

Exception: Unbehandelte Ausnahme bei 0x6E8D1C68 (d3d11.dll) in DirectX.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xCDCDCDCD
10/29/2013 15:36 XxharCs#4
Ja ist halt ne Message Ausgabe. Kannst MessageBox verwenden, oder in ein File schreiben oder normal in einer Konsole ausgeben oder was du willst :)

(SHOW_ERROR in dem Bsp. verwendet um, wie gesagt, kannst dann selber aussuchen wie du dein "Result" dann ausgibst)


Edit 1: Prüf deine Pointer, villt. ist einer von dennen ein NULL Pointer und failt deswegen. (Am Anfang die Pointer immer am besten initialisieren)
10/29/2013 15:56 Mostey#5
Liegt auf jeden Fall nicht an der Funktion, die MessageBox wird mir nichtmals angezeigt.

Dafür liefert der VS Debugger aber was brauchbares:

Code:
-		this	0xcdcdcdcd {m_SwapChain=??? m_Device=??? m_DeviceContext=??? }	CD3D *
		m_SwapChain	<Speicher kann nicht gelesen werden>	
		m_Device	<Speicher kann nicht gelesen werden>	
		m_DeviceContext	<Speicher kann nicht gelesen werden>
Alle 3 Variablen sind Pointer die als private im Header deklariert wurden und im Konstruktor der Klasse mit 0 initialisiert wurden. Warum wird der Zugriff nun verweigert?

Edit: Vergess das oben, ich habe vergessen das Objekt der Klasse auch auf dem Heap zu erstellen, somit waren die Variablen auch nicht initialisiert.

Allerdings gibt es jetzt nochmal ein Problem bei der Shutdown Methode, die gibt mir nämlich auch ne Exception wenn ich das Fenster schließe.

Code:
void CD3D::Shutdown()
{
	m_SwapChain->Release();
	delete m_SwapChain;
	m_SwapChain = 0;

	m_Device->Release();
	delete m_Device;
	m_Device = 0;

	m_DeviceContext->Release();
	delete m_DeviceContext;
	m_DeviceContext = 0;
}
Exception:
Unbehandelte Ausnahme bei 0x00F299ED in DirectX.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000

Debugger meint:
__vfptr <Speicher kann nicht gelesen werden> void * *

Also wieder mal ein (eventuell nicht initialisierter) Pointer, musste mich erstmal durch 4-5 Unterklassen drängeln bis ich da dran kam.
10/29/2013 16:15 XxharCs#6
Quote:
Originally Posted by Mostey View Post
Edit: Vergess das oben, ich habe vergessen das Objekt der Klasse auch auf dem Heap zu erstellen, somit waren die Variablen auch nicht initialisiert.

Allerdings gibt es jetzt nochmal ein Problem bei der Shutdown Methode, die gibt mir nämlich auch ne Exception wenn ich das Fenster schließe.

Code:
void CD3D::Shutdown()
{
	m_SwapChain->Release();
	delete m_SwapChain;
	m_SwapChain = 0;

	m_Device->Release();
	delete m_Device;
	m_Device = 0;

	m_DeviceContext->Release();
	delete m_DeviceContext;
	m_DeviceContext = 0;
}
Exception:
Unbehandelte Ausnahme bei 0x00F299ED in DirectX.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000

Debugger meint:
__vfptr <Speicher kann nicht gelesen werden> void * *

Also wieder mal ein (eventuell nicht initialisierter) Pointer, musste mich erstmal durch 4-5 Unterklassen drängeln bis ich da dran kam.

Es genügt nur das variable->Release(); soweit ich es noch weiß.
Code:
void CD3D::Shutdown()
{
    m_SwapChain->Release();

    m_Device->Release();

    m_DeviceContext->Release();
}
10/29/2013 16:20 +Yazzn#7
Code:
#define SAFE_RELEASE(p) if(p) { p->Release(); p = NULL; }

void CD3D::Shutdown()
{
    SAFE_RELEASE(m_SwapChain);
    SAFE_RELEASE(m_Device);
    SAFE_RELEASE(m_DeviceContext);
}
10/29/2013 16:30 Mostey#8
Quote:
Originally Posted by Yazzn (: View Post
Code:
#define SAFE_RELEASE(p) if(p) { p->Release(); p = NULL; }

void CD3D::Shutdown()
{
    SAFE_RELEASE(m_SwapChain);
    SAFE_RELEASE(m_Device);
    SAFE_RELEASE(m_DeviceContext);
}
Danke, hatte angenommen dass der Check bereits in der Funktion vorhanden ist. Läuft nun sauber. :)