渲染函数c ++ directx9中的访问冲突

时间:2013-08-25 05:04:55

标签: c++ visual-studio-2010 render access-violation directx-9

#include <Windows.h>
#include <d3dx9.h>
#include <sstream>
#include <string>

void initD3D(HWND hWnd);
void Render();
void cleanD3D();

LPDIRECT3D9 d3d ;
LPDIRECT3DDEVICE9 d3ddev;


LRESULT CALLBACK MainWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam, LPARAM lParam)
{
    switch(uMsg){
     case WM_DESTROY:
          PostQuitMessage(0);
          return 0;
    }
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,  HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    HWND mainWnd;
    WNDCLASSEX wndClassData;
    memset(&wndClassData, 0x00, sizeof(wndClassData));

    wndClassData.cbSize = sizeof(wndClassData);
    wndClassData.style = CS_CLASSDC;
    wndClassData.lpfnWndProc = MainWindowProc;
    wndClassData.hInstance = hInstance;
    wndClassData.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClassData.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wndClassData.lpszClassName="ColourMatchingWindow";

    RegisterClassEx(&wndClassData);

        mainWnd = CreateWindowEx(NULL,
        "wndClass",
        "ColourMatching",
        WS_OVERLAPPEDWINDOW,
        100,100,
        800,600,
        GetDesktopWindow(),
        NULL,
        hInstance,
        NULL);

    ShowWindow(mainWnd, nCmdShow);
    initD3D(mainWnd);
    MSG msg;
    for(;;){
    while(PeekMessage(&msg, NULL,0,0,PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    if(msg.message==WM_QUIT)
      break;
        Render();
    }
    cleanD3D();
    UnregisterClass("ColourMatchingWindow", hInstance);
return 0;
}

void initD3D(HWND hWnd){
    d3d = Direct3DCreate9(D3D_SDK_VERSION);

    D3DDISPLAYMODE displayMode;
    d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode);

    D3DPRESENT_PARAMETERS d3dpp;
    memset(&d3dpp, 0, sizeof(d3dpp));

    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3dpp.BackBufferFormat = displayMode.Format;
    d3dpp.BackBufferCount = 1;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

   d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);
}

// ---------------------问题从这里开始--------------------- ----

void Render(){
    d3ddev->Clear(0, NULL, (D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER), 
    D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
    d3ddev->BeginScene();
    d3ddev->EndScene();
    d3ddev->Present(NULL, NULL, NULL, NULL);  
    }

// ------------------------问题结束------------------- ------------

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

VS2010在 render()上给了我关于访问冲突的错误消息,我尝试调试代码,意识到错误可能是由d3ddev没有分配给正确的值引起的,但是我很困惑为什么它没有被分配一个适当的价值并且背后的逻辑是什么?我想d3ddev会在调用 CreateDevice()后创建,但不是出于某些原因。

0 个答案:

没有答案