issue with hResult (again .)

Started by
7 comments, last by Evil Steve 15 years, 11 months ago
Basically these return values must really hate me. I decided to go into my again and I haven't done anything to it. c:\documents and settings\compaq_owner\my documents\visual studio 2005\projects\direct4\direct4\direct5.cpp(36) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\documents and settings\compaq_owner\my documents\visual studio 2005\projects\direct4\direct4\direct5.cpp(114) : warning C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data typedef LONG HRESULT hr; is where the error occurs but I can't find anything wrong with it.

// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>
#ifdef _DEBUG
#   pragma comment(lib, "d3dx9d.lib")
#else
#   pragma comment(lib, "d3dx9.lib")
#endif
#pragma comment(lib, "d3d9.lib")

#include <dxerr.h>
#ifdef _DEBUG
# pragma comment (lib, "dxerr.lib")
#else
#pragma comment (lib, "dxerr.h")
#endif
#pragma comment(lib, "dxerr.lib")




// define the screen resolution and keyboard macros
#define D3D_DEBUG_INFO
#define SCREEN_WIDTH 1440
#define SCREEN_HEIGHT 900
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
// include the Direct3D Library file
#pragma comment (lib, "d3d9.lib")

// global declarations
LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class
LPDIRECT3DVERTEXBUFFER9 t_buffer = NULL;
typedef LONG HRESULT hr;

// function prototypes
void initD3D(HWND hWnd);    // sets up and initializes Direct3D
void render_frame(void);    // renders a single frame
void cleanD3D(void);    // closes Direct3D and releases memory
void init_graphics(void); // 3D declaration

struct CUSTOMVERTEX {FLOAT X, Y, Z, RHW; DWORD COLOR;};
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = L"WindowClass";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL,
                          L"WindowClass",
                          L"Our First Direct3D Program",
                            WS_EX_TOPMOST | WS_POPUP,    // fullscreen values
                          0, 0,    // the starting x and y positions should be 0
                          SCREEN_WIDTH, SCREEN_HEIGHT,    // set the window to 640 x 480
                          NULL,
                          NULL,
                          hInstance,
						  NULL);

    ShowWindow(hWnd, nCmdShow);

    // set up and initialize Direct3D
    initD3D(hWnd);

    // enter the main loop:

    MSG msg;

    while(TRUE)
    {
        DWORD starting_point = GetTickCount();

        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
                break;

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

        render_frame();

		if (KEY_DOWN(VK_ESCAPE))
			PostMessage (hWnd, WM_DESTROY, 0, 0);

        while ((GetTickCount() - starting_point) < 25);
    }

    // clean up DirectX and COM
    cleanD3D();

    return msg.wParam;
}


// this is the main message handler for the program
LRESULT CALLBACK 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);
}


// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
    d3d = Direct3DCreate9(D3D_SDK_VERSION);    // create the Direct3D interface

    D3DPRESENT_PARAMETERS d3dpp;    // create a struct to hold various device information

    ZeroMemory(&d3dpp, sizeof(d3dpp));    // clear out the struct for use
    d3dpp.Windowed = TRUE;    // program windowed, not fullscreen
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames
    d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D
	d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
	d3dpp.BackBufferWidth = SCREEN_WIDTH;
	d3dpp.BackBufferHeight = SCREEN_HEIGHT;

    // create a device class using this information and the info from the d3dpp stuct
    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);

	init_graphics();

    return;
}


// this is the function used to render a single frame
void render_frame(void)
{
    // clear the window to a deep blue
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    d3ddev->BeginScene();    // begins the 3D scene

d3ddev-> SetFVF(CUSTOMFVF);

d3ddev->SetStreamSource(0, t_buffer, 0, sizeof(CUSTOMVERTEX));

d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

    d3ddev->EndScene();    // ends the 3D scene

    d3ddev->Present(NULL, NULL, NULL, NULL);   // displays the created frame on the screen

    return;
}


// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
	t_buffer->Release();
    d3ddev->Release();    // close and release the 3D device
    d3d->Release();    // close and release Direct3D

    return;
}

//this is where I left off - Derl C
// So I will begin - Derl C

void init_graphics(void)
{
CUSTOMVERTEX t_vert[] =
{
	{320.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
	{520.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), },
	{120.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), },

};



d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
						  0,
						  CUSTOMFVF,
						  D3DPOOL_MANAGED,
						  &t_buffer,
						  NULL);

if (FAILED (hr))
{
	DXTRACE_ERR("function failed: ", hr);
}


VOID* pVoid;

t_buffer->Lock(0, 0, (VOID**)&pVoid, 0);
memcpy(pVoid, t_vert, sizeof (CUSTOMVERTEX));
t_buffer->Unlock();

return;

}

Advertisement
typedef LONG HRESULT hr; is meaningless. You're trying to declare a type, and a variable, at the same time -- at least, thats the closest guess I can make.

A typedef requires two arguments, the original type and the alias:
typedef A B;

Whereas variable declaration requires the variable type and name:
B MyB;

Furthermore your typedef, if you removed the malformed 'hr' suffix, is still bogus because the alias (HRESULT) is already used for another identifier.

The line question seems entirely superfluous even if it were changed to be legal code. Why is it there?

Alright so if I don't add that I get this

------ Build started: Project: direct4, Configuration: Debug Win32 ------
Compiling...
direct5.cpp
c:\documents and settings\compaq_owner\my documents\visual studio 2005\projects\direct4\direct4\direct5.cpp(114) : warning C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data
c:\documents and settings\compaq_owner\my documents\visual studio 2005\projects\direct4\direct4\direct5.cpp(217) : error C2065: 'hr' : undeclared identifier
Build log was saved at "file://c:\Documents and Settings\Compaq_Owner\My Documents\Visual Studio 2005\Projects\direct4\direct4\Debug\BuildLog.htm"
direct4 - 1 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

So I posted about that and I was suppose to declare hResult.

-Thanks!
Above your CreateVertexBuffer call put

HRESULT hr;

no typedefs... just declaring a variable of the correct type.


On your CreateVertexBuffer line, precede it with "hr = ", ie: "hr = d3ddev->CreateVertexBuffer...". This will assign the error code from CreateVertexBuffer to the variable hr, which you then check for failure.


You should also do "hr = " on your lock call, and return if it failed. If a lock call fails, attempting to write to the pointer pVoid will crash.


Also, your memcpy is copying a single vertex (sizeof(CUSTOMVERTEX)), which isn't going to work so well.
Hey thanks so much I only have 1 problem.

------ Build started: Project: direct4, Configuration: Debug Win32 ------
Compiling...
direct5.cpp
c:\documents and settings\compaq_owner\my documents\visual studio 2005\projects\direct4\direct4\direct5.cpp(114) : warning C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data
c:\documents and settings\compaq_owner\my documents\visual studio 2005\projects\direct4\direct4\direct5.cpp(219) : error C2664: 'DXTraceW' : cannot convert parameter 4 from 'const char [18]' to 'const WCHAR *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Build log was saved at "file://c:\Documents and Settings\Compaq_Owner\My Documents\Visual Studio 2005\Projects\direct4\direct4\Debug\BuildLog.htm"
direct4 - 1 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

I've never seen that error before so I'm kinda confused.
Your project is apparently UNICODE, which requires wide character buffers (hence WCHAR). In addition, DXTraceW apparently expects a pointer and you're passing it an entire array.

Please don't PM me with questions. Post them in the forums for everyone's benefit, and I can embarrass myself publicly.

You don't forget how to play when you grow old; you grow old when you forget how to play.

Change this:

DXTRACE_ERR("function failed: ", hr);

To this:

DXTRACE_ERR(L"function failed: ", hr);
Yes finally thanks you SO MUCH!
I don't want to put you off or anything, but you really need to have a reasonably strong understanding of C++ before moving on to DirectX. All of the documentation, SDK samples, and most of the answers you'll get on forums (Including this one to a certain extent) will assume that you have a fair to good knowledge of C++ before starting.
Personally, I tried to do what you're doing - throwing myself in at the deep end, and I just ended up constantly having to ask questions that were more about C++ than they were D3D, and spending more time asking questions and waiting on replies than I did actually coding (Anyone who used to use the Lionhead Studios programming discussion board may remember me :P).

This topic is closed to new replies.

Advertisement