2012-03-24 125 views
0

我想初始化directX,但由于某些原因,它无法创建d3d设备。 编译正确,但显示最后的MessageBox( “无法创建D3D设备”)无法创建d3d设备

在调试:
- d3dObject 00000000 IDirect3D9 *
- 的IUnknown {...}的IUnknown
__vfptr CXX0030:错误:表达式无法评估

#include <d3d9.h> 
#include <d3dx9.h> 
#include <windows.h> 

HWND hMainWindow; 

IDirect3D9 *d3dObject = 0; 
IDirect3DDevice9 *d3dDevice = 0; 

bool InitDirectX() 
{ 
    d3dObject = Direct3DCreate9(D3D_SDK_VERSION); 
    if(!d3dObject) 
    { 
     MessageBox(0, "Can't create Direct3D Object", "Error", MB_ICONSTOP); 
     PostQuitMessage(0); 
    } 

    D3DDISPLAYMODE mode; 
    d3dObject->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode); 
    d3dObject->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mode.Format, mode.Format, true); 
    d3dObject->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, false); 

    D3DCAPS9 caps; 
    d3dObject->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); 

    DWORD devBehaviorFlags = 0; 
    if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) 
      devBehaviorFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING; 
    else 
      devBehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING; 

    // If pure device and HW T&L supported 
    if(caps.DevCaps & D3DDEVCAPS_PUREDEVICE && 
      devBehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING) 
       devBehaviorFlags |= D3DCREATE_PUREDEVICE; 

    D3DPRESENT_PARAMETERS d3dpp; 
    d3dpp.BackBufferWidth   = 800; 
    d3dpp.BackBufferHeight   = 600; 
    d3dpp.BackBufferFormat   = D3DFMT_X8R8G8B8; 
    d3dpp.BackBufferCount   = 1; 
    d3dpp.MultiSampleType   = D3DMULTISAMPLE_NONE; 
    d3dpp.MultiSampleQuality   = 0; 
    d3dpp.SwapEffect     = D3DSWAPEFFECT_DISCARD; 
    d3dpp.hDeviceWindow    = hMainWindow; 
    d3dpp.Windowed     = true; 
    d3dpp.EnableAutoDepthStencil  = true; 
    d3dpp.AutoDepthStencilFormat  = D3DFMT_D24S8; 
    d3dpp.Flags      = 0; 
    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; 
    d3dpp.PresentationInterval  = D3DPRESENT_INTERVAL_IMMEDIATE; 


    if(!d3dObject->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hMainWindow, devBehaviorFlags, &d3dpp, &d3dDevice)) 
    { 
     ::MessageBox(0, "Can't create D3D device", "Error", MB_ICONSTOP); 
     return false; 
    } 

    return true; 
} 
+1

有一种工具 - >'$(DXSDK_INSTALL_PATH)\ UTILITES \ BIN \ dxcpl.exe'这将有助于您使用dx dll的调试版本并使错误代码更加冗长。尝试一下发生了什么 – Djole 2012-03-24 09:39:26

回答

2

IDirect3D9 :: CreateDevice返回一个HRESULT不是一个布尔值。 正确的方法来检查,如果该设备已创建是使用成功或失败的宏:

HRESULT hr = d3dObject->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hMainWindow, devBehaviorFlags, &d3dpp, &d3dDevice); 
if(FAILED(hr)) 
{ 
    // hr will be one of the D3DERR_ values 
    ::MessageBox(0, "Can't create D3D device", "Error", MB_ICONSTOP); 
    return false; 
} 
相关问题