LPDIRECT3DDEVICE9初始化为0x00000000的有关问题

LPDIRECT3DDEVICE9初始化为0x00000000的问题
小弟在创建D3D的时候遇到一个问题,问题是这样的:

在m_d3d->CreateDevice这一步发现:
m_device:0x00000000
__vfptr = CXX0030: 错误: 无法计算表达式的值

m_device是一个LPDIRECT3DDEVICE9的对象.

感觉可能是HWND,D3DPRESENT_PARAMETERS的问题,排查过了都没发觉有问题,实在找不到原因了.特来请教大侠.

代码如下:


C/C++ code


HRESULT CGame::InitDXDevice(bool blFullScreen,bool onoffStencil,int MultiSampleType,UINT    GameWidth,UINT    GameHeight)
{

    m_d3d=Direct3DCreate9(D3D_SDK_VERSION);
    m_d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&mode);
    m_d3d->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, &caps);

    DWORD ddselect = 0;
    if(caps.VertexProcessingCaps != 0)
        ddselect = D3DCREATE_HARDWARE_VERTEXPROCESSING |    D3DCREATE_PUREDEVICE;
    else
        ddselect = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    d3dpp.BackBufferWidth=GameWidth;
    d3dpp.BackBufferHeight=GameHeight;
    d3dpp.BackBufferFormat=D3DFMT_X8R8G8B8;
    d3dpp.BackBufferCount=1;
    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow=m_hwnd;

    if (blFullScreen==true)
    {
        d3dpp.Windowed=false;
        d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
    }else
    {
        d3dpp.Windowed=true;
        d3dpp.FullScreen_RefreshRateInHz = mode.RefreshRate;
        d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
    }

    if (onoffStencil)
    {
        d3dpp.EnableAutoDepthStencil=true;
    }else
        d3dpp.EnableAutoDepthStencil=false;

    d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
    GetMultiSampleType(MultiSampleType);

    D3DDEVTYPE MultisampleDevtype=(D3DDEVTYPE )-1;
    DWORD numq=0;

    if( SUCCEEDED(m_d3d->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF ,D3DFMT_X8R8G8B8, d3dpp.Windowed, d3dpp.MultiSampleType, &numq ) ) )
    {
        MultisampleDevtype=D3DDEVTYPE_REF;
    }

    if( SUCCEEDED(m_d3d->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL , D3DFMT_X8R8G8B8, d3dpp.Windowed, d3dpp.MultiSampleType, NULL ) ) )
    {
        MultisampleDevtype=D3DDEVTYPE_HAL;
    }
    if(MultisampleDevtype==(D3DDEVTYPE )-1)
        return E_FAIL;

    m_d3d->CreateDevice(D3DADAPTER_DEFAULT,MultisampleDevtype, m_hwnd, ddselect,&d3dpp, &m_device);
    m_device->SetRenderState(D3DRS_LIGHTING, FALSE);
    m_device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    SetProjMatrix(D3DX_PI / 4, 0.1f, 1000);
    SetView(D3DXVECTOR3(0.0f,0.0f,-10.0f),D3DXVECTOR3(0.0f,0.0f,0.0f),D3DXVECTOR3(0.0f,1.0f,0.0f));

    return S_OK;
}






感激~

------解决方案--------------------
为什么要根据MultiSampleType来确定使用D3DDEVTYPE_HAL还是D3DDEVTYPE_REF呢?
如果显卡不支持你查询的MultiSampleType类型,你就会要求建立一个D3DDEVTYPE_REF类型的设备,但是你前面又设定了D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_PUREDEVICE,那就冲突了吧?
------解决方案--------------------
HRESULT hr = m_d3d->CreateDevice(D3DADAPTER_DEFAULT,MultisampleDevtype, m_hwnd, ddselect,&d3dpp, &m_device);

看看返回的错误是啥

另外在DirectX contral pannel(开始菜单里有)里选择Use Debug Version of Direct3D 9, Debug Output Level选择More, 然后你可以看VC的output窗口是输出什么信息

另外如果对d3d不是很熟悉的话,建议不要用 pure device

------解决方案--------------------
create设备都失败了,看来是create之前代码有什么问题
------解决方案--------------------
继续检查D3DPRESENT_PARAMETERS