2012-03-24 183 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; 
}