0

I posted a while back ago on making directx work in classes. I'm having more issues now. On line 125 (system.cpp), when in debugging, it tells me that it has an access violation. I googled the issue, and someone had said something about initializing the pointer, but that is taken care of in d3d->CreateDevice. If anyone could help me out here, that would be great. Here's my code:
SYSTEM.CPP

#include "system.h"

//////////////////////////////////////////////////
// Class: System
// Private
//////////////////////////////////////////////////

void System::initD3D (void) {
    this->d3d = Direct3DCreate9(D3D_SDK_VERSION);

    ZeroMemory(&(this->d3dpp), sizeof(d3dpp));
    this->d3dpp.Windowed = WINDOWED;
	this->d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	this->d3dpp.hDeviceWindow = this->window;
	this->d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
	this->d3dpp.BackBufferWidth = SCREEN_WIDTH;
	this->d3dpp.BackBufferHeight = SCREEN_HEIGHT;
	this->d3dpp.EnableAutoDepthStencil = TRUE;
	this->d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

	this->d3d->CreateDevice(D3DADAPTER_DEFAULT,
		D3DDEVTYPE_HAL,
		this->window,
		D3DCREATE_SOFTWARE_VERTEXPROCESSING,
		&(this->d3dpp),
		&(this->d3ddev));

	d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE);
	d3ddev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
	d3ddev->SetRenderState(D3DRS_ZENABLE, TRUE);
};

void System::cleanD3D (void) { 
    this->d3d->Release();
    this->d3ddev->Release();
};

void System::setUpHWND (
                        HINSTANCE hInstance,
				        LPSTR lpCmdLine,
				        int nCmdShow) {
    this->hInstance = hInstance;
    this->lpCmdLine = lpCmdLine;
    this->nCmdShow = nCmdShow;

    ZeroMemory(&(this->windowClass), sizeof(WNDCLASSEX));
    this->windowClass.cbSize = sizeof(WNDCLASSEX);
    this->windowClass.style = CS_HREDRAW | CS_VREDRAW;
    this->windowClass.lpfnWndProc = System::StaticWindowProc;
    this->windowClass.hInstance = this->hInstance;
    this->windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	this->windowClass.lpszClassName = "WindowClass";
    RegisterClassEx(&(this->windowClass));

    this->window = CreateWindowEx(NULL, "WindowClass", "The Direct3D Program", 
        WS_OVERLAPPEDWINDOW, SCREEN_X, SCREEN_Y, SCREEN_WIDTH, SCREEN_HEIGHT,
        NULL, NULL, this->hInstance, NULL);
};

LRESULT CALLBACK System::StaticWindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    System *SystemPtr = (System*)GetWindowLong(hWnd, GWLP_USERDATA);
 
    if(SystemPtr)
    {
        return SystemPtr->WindowProc(hWnd, message, wParam, lParam);
    }
    else
    {
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
};

LRESULT System::WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
	switch(message)
	{
	case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		} break;
	}
	
	return DefWindowProc(hWnd, message, wParam, lParam);
};

//////////////////////////////////////////////////
// Class: System
// Public
//////////////////////////////////////////////////

/*
System::System (void) {
    this->setUpHWND(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow);
};
*/
System::System (void) {
};

System::System (
                HINSTANCE hInstance,
                LPSTR lpCmdLine,
                int nCmdShow) {
    this->setUpHWND(hInstance, lpCmdLine, nCmdShow);

	ShowWindow(this->window, this->nCmdShow);

    this->initD3D();
};

System::System (const System &) {
};

System::~System (void) {
    this->cleanD3D();
};

void System::renderFrame (void) {
    // Update the camera here

    // Update objects

    // Clear objects

    // FOR SOME REASON THERE IS AN ERROR HERE
    this->d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0);
	this->d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

	this->d3ddev->BeginScene();

    // Draw objects

    // Finish up
    this->d3ddev->EndScene(); 

	this->d3ddev->Present(NULL, NULL, NULL, NULL);
};

main.cpp

#include "system.h"

int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,
                   int nCmdShow) {
    System MainSys;
    MainSys = System(hInstance, lpCmdLine, nCmdShow);

    // Enter the main loop
	MSG msg;

	while (TRUE)
	{
		while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

		if (msg.message == WM_QUIT)
			break;

		MainSys.renderFrame();
	}

	// Clean up DirectX and the COM
	//delete MainSys;

	return msg.wParam;
};

If you need system.h, let me know

1
Contributor
1
Reply
2
Views
6 Years
Discussion Span
Last Post by hondros
0

Fixed the problem, never mind. Just had to call System, instead of making two instances of it.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.