Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 渲染函数c+处的访问冲突+;directx9_C++_Visual Studio 2010_Render_Access Violation_Directx 9 - Fatal编程技术网

C++ 渲染函数c+处的访问冲突+;directx9

C++ 渲染函数c+处的访问冲突+;directx9,c++,visual-studio-2010,render,access-violation,directx-9,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 ; LPDIRECT3

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

#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);  
    }

VS2010在render()上给了我关于访问冲突的错误消息,我试着调试代码,意识到错误可能是由d3ddev没有分配到正确的值引起的,但是我很困惑为什么没有分配到正确的值,以及它背后的逻辑是什么?我原以为只要调用了CreateDevice(),就会创建d3ddev,但这不是出于某些原因。

但是在上面的代码中,
d3ddev
在哪里初始化?我假设在我再次声明它时,它会自动初始化。不会的。是因为CreateWindowEx没有正确初始化吗?很可能就是这样。查看传递给CreateWindowEx的windows类字符串名称与您刚刚完成注册的windows类字符串名称。CreateWindowEx的第一个参数应该是
“ColorMatchingWindow”
;不是
“wndClass”
。从那开始。作为记录,检查API函数结果很容易就会告诉您调用失败。忽视它们是一个坏习惯,所以现在就改掉这个习惯。
void cleanD3D(){
            d3d->Release();
            d3ddev->Release();
    }