Question

Googled for a couple of hours already to solve this error and found out a lot of people get this error, but haven't found a solution for my own case yet.

Most of the time the solution is to change the SubSystem to the appropriate option in the solution's properties, either to Console or Windows. But mine is set to windows, which is the right one in my case.

When I created this solution I used File > New > Project > Win32 Project > (selected) Windows application > (checked) Empty project

My character set is set to Unicode, which I think is default.

This is my code, main.cpp:

// STANDARD WINDOWS HEADERS
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <atlbase.h>

// D3D9 HEADERS
#include <d3d9.h>

// USER MADE HEADERS
#include "errorhelper.h"

#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "DxErr.lib")

// GLOBALS
CComPtr<IDirect3D9>                 d3d;
CComPtr<IDirect3DDevice9>           d3ddev;
CComPtr<IDirect3DVertexBuffer9>     vbuffer;
CComPtr<IDirect3DIndexBuffer9>      ibuffer;

namespace GameEngine
{
    // define the windowed resolution
    #define SCREEN_WIDTH    1280                                // horizontal resolution
    #define SCREEN_HEIGHT   720                                 // vertical resolution
    #define CheckHr(hr) CheckForDxError(__FILE__,__LINE__,hr)
    #define D3DFVF_VERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

    struct VERTEX
    {
        FLOAT x, y, z, rhw;
        DWORD color;
    };

    //-----------------------------------------------------------------------------
    // Name: InitVB()
    // Desc: Initializes the vertex buffer
    //-----------------------------------------------------------------------------
    void InitVB()
    {
        VERTEX vertices[] = 
        {
            {0.0f,  0.0f,   0.0f,   1.0f,   0xffffffff},
            {10.0f, 0.0f,   0.0f,   1.0f,   0xffffffff},
            {10.0f, 10.0f,  0.0f,   1.0f,   0xffffffff},
            {0.0f,  10.0f,  0.0f,   1.0f,   0xffffffff},
        };      
        CheckHr(d3ddev->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_VERTEX, D3DPOOL_DEFAULT, &vbuffer, NULL));
        void* pvertices;
        CheckHr(vbuffer->Lock(0, sizeof(vertices), (void**) &pvertices, 0));
        memcpy(pvertices, vertices, sizeof(vertices));
        CheckHr(vbuffer->Unlock());
    }

    //-----------------------------------------------------------------------------
    // Name: InitIB()
    // Desc: Initializes the index buffer
    //----------------------------------------------------------------------------
    void InitIB()
    {
        short indices[] =
        {
            0, 1, 2,
            2, 3, 0
        };
        CheckHr(d3ddev->CreateIndexBuffer(sizeof(indices), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &ibuffer, NULL));
        void* pindices;
        CheckHr(ibuffer->Lock(0, sizeof(indices), (void**) &pindices, 0));
        memcpy(pindices, indices, sizeof(indices));
        CheckHr(ibuffer->Unlock());
    }

    //-----------------------------------------------------------------------------
    // Name: Render()
    // Desc: Draws the scene
    //-----------------------------------------------------------------------------
    void Render()
    {
        if( d3ddev == NULL )
            return;

        CheckHr(d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0));

        CheckHr(d3ddev->BeginScene());

        CheckHr(d3ddev->SetStreamSource(0, vbuffer, 0, sizeof(VERTEX)));
        CheckHr(d3ddev->SetIndices(ibuffer));
        CheckHr(d3ddev->SetFVF(D3DFVF_VERTEX));

        CheckHr(d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2));

        CheckHr(d3ddev->EndScene());

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

    //-----------------------------------------------------------------------------
    // Name: InitD3D()
    // Desc: Initializes Direct3D
    //-----------------------------------------------------------------------------
    void InitD3D( HWND hWnd )
    {
        // Create the d3d object
        d3d.Attach(::Direct3DCreate9(D3D_SDK_VERSION));
        if( NULL == d3d )
            throw("Failed to create Direct3D object");

        // Set the device settings
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp, sizeof(d3dpp));
        d3dpp.BackBufferWidth = SCREEN_WIDTH;                   // width of back buffer
        d3dpp.BackBufferHeight = SCREEN_HEIGHT;                 // height of the back buffer
        d3dpp.BackBufferCount = 1;                              // number of back buffers
        d3dpp.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES;       // MSAA (anti-alia, number of samples
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;               // how to swap the front and back buffer
        d3dpp.hDeviceWindow = hWnd;                             // handle to the window
        d3dpp.Windowed = TRUE;                                  // fullscreen/windowed

        // Create the device 
        CheckHr( d3d->CreateDevice(D3DADAPTER_DEFAULT, 
                                        D3DDEVTYPE_HAL, 
                                        hWnd, 
                                        D3DCREATE_HARDWARE_VERTEXPROCESSING, 
                                        &d3dpp, &d3ddev ));
    }

    //-----------------------------------------------------------------------------
    // Name: Cleanup()
    // Desc: Releases all previously initialized objects
    //-----------------------------------------------------------------------------
    void Cleanup()
    {
        d3d = 0;
        d3ddev = 0;
        vbuffer = 0;
        ibuffer = 0;
    }

    //-----------------------------------------------------------------------------
    // Name: WindowProc()
    // Desc: The window's message handler
    //-----------------------------------------------------------------------------
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
            // the message that is sent when you click on the red x
            case WM_DESTROY:
                Cleanup();
                PostQuitMessage(0);
                return 0;

            case WM_PAINT:
                Render();
                ValidateRect( hWnd, NULL );
                return 0;
        }

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

    //-----------------------------------------------------------------------------
    // Name: WinMain()
    // Desc: The application's entry point
    //-----------------------------------------------------------------------------
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        // Create the window class
        WNDCLASSEX wc;
        ZeroMemory(&wc, sizeof(WNDCLASSEX));
        wc.cbSize           = sizeof(WNDCLASSEX);           
        wc.style            = CS_HREDRAW | CS_VREDRAW;      
        wc.lpfnWndProc      = WindowProc;                   
        wc.hInstance        = hInstance;                    
        wc.hCursor          = LoadCursor(NULL, IDC_ARROW);  
        wc.hbrBackground    = (HBRUSH)COLOR_WINDOW;         
        wc.lpszClassName    = L"WindowClass1";              

        // Register the window class
        RegisterClassEx(&wc);

        // Calculate the neede window size
        RECT ws = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT};          
        AdjustWindowRect(&ws, WS_OVERLAPPEDWINDOW, FALSE);

        // Ceate the window
        HWND hWnd = CreateWindowEx(NULL, L"WindowClass1", L"Game Engine", WS_OVERLAPPEDWINDOW,  
                                   300, 300, ws.right - ws.left, ws.bottom - ws.top, 
                                   NULL, NULL, hInstance, NULL);    
        // Initialize Direct3D
        InitD3D(hWnd);

        InitVB();
        InitIB();

        // Show the window
        ShowWindow( hWnd, nCmdShow );

        // The message loop.
        MSG msg; 
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }


        UnregisterClass( L"WindowClass1", hInstance );
        return 0;
    }   
}

And errorhelper.h:

#include <Windows.h>
#include <windowsx.h>
#include <comdef.h>
#include <DxErr.h>

#pragma comment (lib, "DxErr.lib")

void CheckForDxError(const char *file, int line, HRESULT hr)
{
    if (!FAILED(hr))
        return;

    // Get the direct X error and description
    char desc[1024];
    sprintf( desc,  "(DX) %s - %s" , DXGetErrorString(hr),  DXGetErrorDescription(hr) );

    // Output the file and line number in the correct format + the above DX error
    char buf[4096];
    sprintf( buf,  "%s(%d) : Error: %s\n", file, line, desc);

    OutputDebugStringA(buf);

    // Cause the debugger to break here so we can fix the problem
    DebugBreak();
}

If there is any information still needed, please ask,

Thanks

Was it helpful?

Solution

You put your WinMain into a C++ namespace. WinMain() has to be a free function in the global namespace, not in your application namespace.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top