CreateDevice in IDirect3D9 gives "D3DERR_INVALIDCALL"

Started by
3 comments, last by rkaganda 18 years, 5 months ago
i downloaded some sample code off a site and put it into dev c after taking care of a few link errors it compiled and linked fine but nothing happens ... i get a flash of the console then nothing the code is as follows

#include <d3d8.h>

LPDIRECT3D8             g_pD3D			= NULL;
LPDIRECT3DDEVICE8       g_pD3DDevice	= NULL;

HRESULT InitialiseD3D(HWND hWnd)
{
	//First of all, create the main D3D object. If it is created successfully we 
	//should get a pointer to an IDirect3D8 interface.
    g_pD3D = Direct3DCreate8(D3D_SDK_VERSION);
	if(g_pD3D == NULL)
	{
        return E_FAIL;
	}

    //Get the current display mode
    D3DDISPLAYMODE d3ddm;
    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
	{
        return E_FAIL;
	}

	//Create a structure to hold the settings for our device
    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory(&d3dpp, sizeof(d3dpp));

	//Fill the structure. 
	//We want our program to be windowed, and set the back buffer to a format
	//that matches our current display mode
    d3dpp.Windowed			= TRUE;
    d3dpp.SwapEffect		= D3DSWAPEFFECT_COPY_VSYNC;
    d3dpp.BackBufferFormat	= d3ddm.Format;

	//Create a Direct3D device.
	if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 
								   D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice)))
    {
        return E_FAIL;
    }
    
    return S_OK;
}

void Render()
{
    if(g_pD3DDevice == NULL)
	{
        return;
	}

    //Clear the backbuffer to a green color
    g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0);
    
    //Begin the scene
    g_pD3DDevice->BeginScene();
    
    //Rendering of our game objects will go here
    
    //End the scene
    g_pD3DDevice->EndScene();
    
    //Filp the back and front buffers so that whatever has been rendered on the back buffer
	//will now be visible on screen (front buffer).
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}

void CleanUp()
{
    if(g_pD3DDevice != NULL)
	{
        g_pD3DDevice->Release();
		g_pD3DDevice = NULL;
	}

    if(g_pD3D != NULL)
	{
        g_pD3D->Release();
		g_pD3D = NULL;
	}
}

void GameLoop()
{
	//Enter the game loop
    MSG msg; 
    BOOL fMessage;

	PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
	
	while(msg.message != WM_QUIT)
	{
		fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);

		if(fMessage)
		{
			//Process message
			TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
		else
		{
			//No message to process, so render the current scene
			Render();
		}

	}
}

//The windows message handler
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
		break;
		case WM_KEYUP: 
            switch (wParam)
			{ 
                case VK_ESCAPE:
					//User has pressed the escape key, so quit
	                DestroyWindow(hWnd);
					return 0;
		        break;
            } 
        break;

    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}

//Application entry point
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
    //Register the window class
    WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L, 
                     GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                     "DX Project 1", NULL};
    RegisterClassEx(&wc);

    //Create the application's window
    HWND hWnd = CreateWindow("DX Project 1", "www.andypike.com: Tutorial 1", 
                              WS_OVERLAPPEDWINDOW, 50, 50, 500, 500,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL);

    //Initialize Direct3D
    if(SUCCEEDED(InitialiseD3D(hWnd)))
    { 
        //Show our window
        ShowWindow(hWnd, SW_SHOWDEFAULT);
        UpdateWindow(hWnd);

		//Start game running: Enter the game loop
		GameLoop();
    }
    
	CleanUp();

	UnregisterClass("DX Project 1", wc.hInstance);
    
	return 0;
}




it compiles and run's fine but i dont even get a window edit: i checked and RegisterClassEx doesnt return 0 and hWnd isnt NULL so my problem isnt there? [Edited by - rkaganda on November 11, 2005 7:28:08 PM]
im learning...i think?
Advertisement
Single step it through your debugger to see where it's failing.

It could be a number of things. Is directX installed? Are your display properties valid?

That's odd; you don't have "#include <windows.h>". It shouldn't even get past the compiler. Well, try adding that #include anyway and see if it changes anything.
Line 35 of d3d8.h (in the last DX9 SDK)
  #include <windows.h>


The problem is not here.

Are you sure that the InitializeD3D() function don't return E_FAIL?

Regards,
I found that im returning E_FAIL at line 38
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 								   D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice)))    {        return E_FAIL;    }


DXGetErrorString9() gives me "D3DERR_INVALIDCALL"

hWnd, &d3dpp, and &g_pD3DDevice arent not NULL.
I've also tired changing D3DCREATE_SOFTWARE_VERTEXPROCESSING to D3DCREATE_HARDWARE_VERTEXPROCESSING and D3DDEVTYPE_HAL to D3DDEVTYPE_REF but the same error results.

Wherebouts could I be going wrong?

[Edited by - rkaganda on November 11, 2005 5:11:59 PM]
im learning...i think?

This topic is closed to new replies.

Advertisement