我的程序编译通过,执行的时候出现“"0x00401b26"指令引用的"0x00000000"内存。该内存不能为"read"”的错误提示框,
我的系统是win2000,用vc6.0
请问出现上诉错误是什么原因??
谢谢!

解决方案 »

  1.   

    #include <d3dx8.h>LPDIRECT3D8 g_pD3D = NULL;
    LPDIRECT3DDEVICE8 g_pD3DDevice = NULL;
    LPDIRECT3DVERTEXBUFFER8 g_pVertexBuffer = NULL;struct CUSTOMVERTEX
    {
    FLOAT x, y, z;
    DWORD colour;
    };#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)#define SafeRelease(pObject) if(pObject == NULL) {pObject->Release(); pObject = NULL;}HRESULT InitialiseD3D(HWND hWnd)
    {
    g_pD3D = Direct3DCreate8(D3D_SDK_VERSION);
    if(g_pD3D == NULL)
    {
    return E_FAIL;
    } D3DDISPLAYMODE d3ddm;
    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
    {
    return E_FAIL;
    }

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC;
    d3dpp.BackBufferFormat = d3ddm.Format; if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, 
    D3DDEVTYPE_HAL,
    hWnd,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    &d3dpp,
    &g_pD3DDevice)))
    {
    return E_FAIL;
    } g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
    g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); return S_OK;
    }HRESULT InitialiseVertexBuffer()
    {
    VOID* pVertices; CUSTOMVERTEX cvVertices[] =
    {
    {-5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(0, 0, 255),},
    {-5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(255, 0, 0),},
    {5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),},
    {5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),}, {-5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),},
    {-5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(0, 0, 255),},
    {5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(0, 255, 0),},
    {5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),}, {5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 0, 255),},
    {5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),}, {-5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),},
    {-5.0f, 5.0f, 5.0f, D3DCOLOR_XRGB(255, 0, 0),}, {-5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),},
    {-5.0f, 5.0f, -5.0f, D3DCOLOR_XRGB(0, 0, 255),}, {5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(0, 255, 0),},
    {5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 0, 255),},
    {-5.0f, -5.0f, -5.0f, D3DCOLOR_XRGB(255, 0, 0),},
    {-5.0f, -5.0f, 5.0f, D3DCOLOR_XRGB(0, 255, 0),}, }; if(FAILED(g_pD3DDevice->CreateVertexBuffer(18 * sizeof(CUSTOMVERTEX),
    0,
    D3DFVF_CUSTOMVERTEX,
    D3DPOOL_DEFAULT,
    &g_pVertexBuffer)))
    {
    return E_FAIL;
    } if(FAILED(g_pVertexBuffer->Lock(0, sizeof(cvVertices),
    (BYTE**)&pVertices, 0)))
    {
    return E_FAIL;
    }
    memcpy(pVertices, cvVertices, sizeof(cvVertices));
    g_pVertexBuffer->Unlock();
    return S_OK;
    }void SetupRotation()
    {
    D3DXMATRIX matWorld, matWorldX, matWorldY, matWorldZ; D3DXMatrixRotationX(&matWorldX, timeGetTime()/400.0f);
    D3DXMatrixRotationY(&matWorldY, timeGetTime()/400.0f);
    D3DXMatrixRotationZ(&matWorldZ, timeGetTime()/400.0f); D3DXMatrixMultiply(&matWorld, &matWorldX, &matWorldY);
    D3DXMatrixMultiply(&matWorld, &matWorld, &matWorldZ); g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);
    }void SetupCamera()
    {
    D3DXMATRIX matView;
    D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(0.0f, 0.0f, -30.0f),
     &D3DXVECTOR3(0.0f, 0.0f, 0.0f),
     &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
    g_pD3DDevice->SetTransform(D3DTS_VIEW, &matView);
    }void SetupPerspective()
    {
    D3DXMATRIX matProj;
    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 500.0f);
    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);}void Render()
    {
    if(g_pD3DDevice == NULL)
    {
    return;
    } g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,
    D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); g_pD3DDevice->BeginScene(); SetupRotation();
    SetupCamera();
    SetupPerspective(); g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer, sizeof(CUSTOMVERTEX));
    g_pD3DDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
    g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
    g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 4, 8);
    g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 14, 2); g_pD3DDevice->EndScene(); g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
    }void ClearUp()
    {
    SafeRelease(g_pVertexBuffer);
    SafeRelease(g_pD3DDevice);
    SafeRelease(g_pD3D);
    }void GameLoop()
    {
    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)
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    else
    {
    Render();
    }
    }
    }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:
    DestroyWindow(hWnd);
    return 0;
    break;
    }
    break;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);}INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
    {
    WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0l,
    0l, GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
    "DX Project3", NULL};
    RegisterClassEx(&wc); HWND hWnd = CreateWindow("DX Project 3", "www.andypike.com:Tutorial 3",
    WS_OVERLAPPEDWINDOW, 50, 50, 500, 500,
    GetDesktopWindow(), NULL, wc.hInstance, NULL); if(SUCCEEDED(InitialiseD3D(hWnd)))
    {
    ShowWindow(hWnd, SW_SHOWDEFAULT);
    UpdateWindow(hWnd); if(SUCCEEDED(InitialiseVertexBuffer()))
    {
    GameLoop();
    }
    }
    ClearUp(); UnregisterClass("DX Project 3", wc.hInstance);
    return 0;
    }
    各位大哥帮帮忙,我真不知道咋回事了!
      

  2.   

    谁有空帮你看这么一大段代码呀,而且是D3D的,你编译成Debug版,调试(F5)运行吧,就知道哪句语句出现非法内存访问了。