C++ Can';不要创建d3d设备

C++ Can';不要创建d3d设备,c++,directx,directx-9,C++,Directx,Directx 9,我正在尝试初始化directX,但由于某些原因,它无法创建d3d设备。 它编译正确,但显示最后一个messagebox(“无法创建D3D设备”) 调试时: -d3dObject 0x00000000 IDirect3D9* -IUnknown{…}IUnknown __vfptr CXX0030:错误:无法计算表达式 #include <d3d9.h> #include <d3dx9.h> #include <windows.h> HWND hMainWin

我正在尝试初始化directX,但由于某些原因,它无法创建d3d设备。 它编译正确,但显示最后一个messagebox(“无法创建D3D设备”)

调试时:
-d3dObject 0x00000000 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;
}
#包括
#包括
#包括
主窗口;
IDirect3D9*d3dObject=0;
IDirect3DDevice9*d3dDevice=0;
bool InitDirectX()
{
d3dObject=Direct3DCreate9(D3D_SDK_版本);
if(!d3dObject)
{
消息框(0,“无法创建Direct3D对象”,“错误”,MB_ICONSTOP);
PostQuitMessage(0);
}
D3D显示模式;
d3dObject->GetAdapterDisplayMode(D3DADAPTER_默认值和模式);
d3dObject->CheckDeviceType(D3DADAPTER_默认值,D3DDEVTYPE_HAL,mode.Format,mode.Format,true);
d3dObject->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_X8R8G8B8,D3DFMT_X8R8G8B8,false);
D3DCAPS9帽;
d3dObject->GetDeviceCaps(D3DADAPTER\u默认值、D3DDEVTYPE\u HAL和caps);
DWORD devBehaviorFlags=0;
如果(caps.DevCaps和D3DDEVCAPS_-hw转换灯)
devBehaviorFlags |=D3D创建硬件处理;
其他的
devBehaviorFlags |=D3DCREATE_软件_VERTEXPROCESSING;
//如果支持纯设备和硬件T&L
如果(caps.DevCaps和D3DDEVCAPS_PUREDEVICE&&
devBehaviorFlags和D3D创建硬件(垂直处理)
devBehaviorFlags |=D3DCREATE_PUREDEVICE;
D3D当前参数d3dpp;
d3dpp.BackBufferWidth=800;
d3dpp.BackBufferHeight=600;
d3dpp.BackBufferFormat=D3DFMT_X8R8G8B8;
d3dpp.BackBufferCount=1;
d3dpp.MultiSampleType=D3DMULTISAMPLE\u无;
d3dpp.MultiSampleQuality=0;
d3dpp.SwapEffect=d3dswapeeffect_DISCARD;
d3dpp.hDeviceWindow=hMainWindow;
d3dpp.Windowed=true;
d3dpp.EnableAutoDepthStencil=true;
d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;
d3dpp.Flags=0;
d3dpp.FullScreen\u RefreshRateInHz=D3DPRESENT\u RATE\u默认值;
d3dpp.PresentationInterval=D3DPRESENT\u INTERVAL\u IMMEDIATE;
如果(!d3dObject->CreateDevice(D3DADAPTER_默认值、D3DDEVTYPE_HAL、hMainWindow、devBehaviorFlags、d3dpp和d3dDevice))
{
::MessageBox(0,“无法创建D3D设备”,“错误”,MB_ICONSTOP);
返回false;
}
返回true;
}

IDirect3D9::CreateDevice返回HRESULT而不是bool。 检查设备是否已创建的正确方法是使用成功或失败的宏:

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

IDirect3D9::CreateDevice返回HRESULT而不是bool。 检查设备是否已创建的正确方法是使用成功或失败的宏:

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

调试D3D9的最佳方法是启用调试DLL,如前面的回答中所述。不幸的是,Windows7及以前版本支持D3D9调试DLL。如果您使用的是Windows 8或更高版本,那么最好的选择是转到D3D11(您可能希望这样做)。根据您的描述,您说程序显示第二个MessageBox,这意味着调用CreateDevice失败。但是您提到调试器说d3dObject为null。我将假设您获取此读数的位置在调用Direct3DCreate9之前,否则您的程序将在第二个消息框出现之前崩溃


在您的特定情况下,CreateDevice实际上是成功的,因为HRESULT为0意味着成功(S_OK),因此如前一个答案所述,使用成功或失败的宏检查HRESULT状态,而不是将thrm解释为bools。

调试D3D9的最佳方法是启用前一个答案中提到的调试DLL。不幸的是,Windows7及以前版本支持D3D9调试DLL。如果您使用的是Windows 8或更高版本,那么最好的选择是转到D3D11(您可能希望这样做)。根据您的描述,您说程序显示第二个MessageBox,这意味着调用CreateDevice失败。但是您提到调试器说d3dObject为null。我将假设您获取此读数的位置在调用Direct3DCreate9之前,否则您的程序将在第二个消息框出现之前崩溃

在您的特定情况下,CreateDevice实际上是成功的,因为HRESULT为0意味着成功(S_OK),所以正如前面的回答所说,使用成功或失败的宏检查HRESULT状态,而不是将thrm解释为bools。

有一个工具->
$(DXSDK_安装路径)\Utilites\bin\dxcpl.exe
,这将帮助您使用dx DLL的调试版本,并使错误代码更加详细。试着用它做些什么有一个工具->
$(DXSDK\u INSTALL\u PATH)\Utilites\bin\dxcpl.exe
,它将帮助您使用dx DLL的调试版本,并使错误代码更加详细。试试看会发生什么