Jump to content
  • Advertisement
Sign in to follow this  
Lost

DX8 crashing with Unhandled exception: access violation.

This topic is 4451 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

The code compiles without any problems, but when I run it I get error message. When I run the debug it says "Unhandled exception in Terrain.exe: 0xC0000005: Access Violation". I'm mostly using this to help speed up the typing & only have switched it to a class handling DX. Can someone help, or at least point me in the right direction please.
//main.cpp
#define WIN32_LEAN_AND_MEAN
#include <afxwin.h>
#include <windows.h>
#include "TEclass.h"

// a simple WndProc that validates a window and kills it when the time comes
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
	switch(iMsg)
	{
	case WM_ERASEBKGND:
			return 0;

		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
	}

	return DefWindowProc(hwnd, iMsg, wParam, lParam);
} // WndProc

// the main purpose of this function is to build a window and call DirectX
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int iCmdShow)
{
	const TCHAR szClassName[] = _T("DirectX 8 Tutorial");

    // build us a window
	WNDCLASSEX wndclass =
	{
		sizeof(wndclass),                   // cbSize
		CS_HREDRAW | CS_VREDRAW,            // style
		WndProc,                            // lpfnWndProc
		0,                                  // cbClsExtra
		0,                                  // cbWndExtra
		hInstance,                          // hInstance
		LoadIcon(NULL, IDI_APPLICATION),    // hIcon
		LoadCursor(NULL, IDC_ARROW),        // hCursor
		NULL,                               // hBackground
		NULL,                               // lpszMenuName
		szClassName,                        // lpszClassName
		LoadIcon(NULL, IDI_APPLICATION)     // hIconSm
	};

	RegisterClassEx(&wndclass);

	HWND hwnd	= CreateWindow(szClassName,           // lpClassName
								szClassName,           // lpWindowName
								WS_OVERLAPPEDWINDOW,   // dwStyle
								CW_USEDEFAULT,         // x
								CW_USEDEFAULT,         // y
								CW_USEDEFAULT,         // nWidth
								CW_USEDEFAULT,         // nHeight
								NULL,                  // hwndParent
								NULL,                  // hMenu
								hInstance,             // hInstance
								NULL);                 // lpParam

    // in a real app, you might want to give an error message here
 //	if(FAILED(InitDirect3D(hwnd)))
 //		return 0;
	TEngine graphics(hwnd);
	ShowWindow(hwnd, iCmdShow);
	UpdateWindow(hwnd);

	while(1)
	{
		// clear out all the messages before we draw a new frame
		MSG msg;
		while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			if(WM_QUIT == msg.message)
			{
//				ShutdownDirect3D();
				return msg.wParam;
			}

			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

        // draw a frame and end if we error
		if(FAILED(graphics.DrawScene()))
		{
			DestroyWindow(hwnd);
		}
	}
} // WinMain
//TEclass.h
#include <d3dx8.h>

class TEngine{
public:
	TEngine(HWND hwnd);
	~TEngine();
	HRESULT DrawScene();


private:
	IDirect3D8 * m_pID3D;
	IDirect3DDevice8 * m_pID3DDevice;
	IDirect3DVertexBuffer8 * m_pStreamData;
	IDirect3DIndexBuffer8 * m_pIndexBuffer;
	IDirect3DTexture8 * m_pTexture;
	HRESULT m_DXresult;
};

HRESULT TEngine::DrawScene()
{
	HRESULT hr;
	do
	{
        // clear back buffer
		hr = m_pID3DDevice->Clear(	0, 
															NULL,
															D3DCLEAR_TARGET,
															D3DCOLOR_RGBA(0,63,0,0),
															0,
															0);

		if(FAILED(hr))
			break;

        // start drawing
		hr = m_pID3DDevice->BeginScene();
		if(FAILED(hr))
			break;

        // Put all drawing code here

		hr = m_pID3DDevice->EndScene();
		if(FAILED(hr))
			break;

        // flip back buffer to front
		hr = m_pID3DDevice->Present(NULL, NULL, NULL, NULL);
	} while(0);

	return hr;
}

TEngine::TEngine(HWND hwnd){


	IDirect3D8 * m_pID3D									= NULL;
	IDirect3DDevice8 * m_pID3DDevice			= NULL;
	IDirect3DVertexBuffer8 * m_pStreamData	 = NULL;
	IDirect3DIndexBuffer8 * m_pIndexBuffer		= NULL;
	IDirect3DTexture8 * m_pTexture					 = NULL;


	m_pID3D = Direct3DCreate8(D3D_SDK_VERSION);

	do
	{
		// we need the display mode so we can get
		// the properties of our back buffer
		D3DDISPLAYMODE d3ddm;
		m_DXresult = m_pID3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
		if(FAILED(m_DXresult))
			break;

		D3DPRESENT_PARAMETERS present;
		ZeroMemory(&present, sizeof(present));
		present.SwapEffect       = D3DSWAPEFFECT_COPY;
		present.Windowed         = TRUE;
		present.BackBufferFormat = d3ddm.Format;

		m_DXresult = m_pID3D->CreateDevice(D3DADAPTER_DEFAULT,
								D3DDEVTYPE_HAL,
								hwnd,
								D3DCREATE_SOFTWARE_VERTEXPROCESSING,
								&present,
								&m_pID3DDevice);

		if(FAILED(m_DXresult))
			break;

        // we do our own coloring, so disable lighting
		m_DXresult = m_pID3DDevice->SetRenderState(D3DRS_LIGHTING,
                                         FALSE);

	} while(0);

}


TEngine::~TEngine(){
	if (m_pID3D != NULL) { m_pID3D->Release(); m_pID3D = NULL; }
	if (m_pID3DDevice != NULL) { m_pID3DDevice->Release(); m_pID3DDevice = NULL; }
	if (m_pStreamData != NULL) { m_pStreamData->Release(); m_pStreamData = NULL; }
	if (m_pIndexBuffer != NULL) { m_pIndexBuffer->Release(); m_pIndexBuffer = NULL; }
	if (m_pTexture != NULL) { m_pTexture->Release(); m_pTexture = NULL; }
	return;
}

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!