2010-08-06 108 views
1

我刚刚开始学习如何在C++中编写DirectX 9应用程序,所以我仍然不是很好,而且我正在搞乱它。DirectX 9 C++程序崩溃并且不会重新打开

当我在程序崩溃后重新打开程序时,D3D设备无法创建,结果为D3DERR_INVALIDCALL。我正在用MinGW中的G ++编译,使用DirectX 2009年的SDK。我猜这是因为我没有发布所有的设备和纹理等崩溃时,它仍然认为我使用它们。它在重新启动时重新打开。有人能够指出我如何排序“重置”DirectX的正确方向吗?

这里是我用什么来创建设备:

D3D = Direct3DCreate9(D3D_SDK_VERSION); 

D3DPRESENT_PARAMETERS D3DPP; 
ZeroMemory(&D3DPP, sizeof(D3DPP)); 
D3DPP.Windowed = TRUE; 
D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD; 
D3DPP.hDeviceWindow = hWnd; 
D3DPP.BackBufferFormat = D3DFMT_X8R8G8B8; 
D3DPP.BackBufferWidth = WIDTH; 
D3DPP.BackBufferHeight = HEIGHT; 
D3DDevice = 0; //Null pointer to make sure I can check it 
HRESULT hr = D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, 
hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DPP, &D3DDevice); 

if (!D3DDevice) { 
    MessageBox(NULL,"Device could not be created","error",0); 
    switch (hr) { 
    case D3DERR_DEVICELOST: 
    MessageBox(NULL,"1","error",0); 
    break; 
    case D3DERR_INVALIDCALL: 
    MessageBox(NULL,"2","error",0); 
    break; 
    case D3DERR_NOTAVAILABLE: 
    MessageBox(NULL,"3","error",0); 
    break; 
    case D3DERR_OUTOFVIDEOMEMORY: 
    MessageBox(NULL,"4","error",0); 
    break; 
    }; 
    return 1; 
}; 
return 0; 
+0

给我们一些代码看看,我们可能会帮助... – 2010-08-06 11:07:48

回答

0

似乎在MsgProc中的某个东西导致该窗口失败的设备,我的程序崩溃。不管怎么说,还是要谢谢你。

0

好吧,我不得不问。在拨打电话之前,您是否有有效 hWnd?

确保它是有效的,好事情可能发生。 :-)

+0

当然,hWnd存在。正如我所说的那样,它只有一次,当我在“遇到问题”后再次打开它时,它不会工作。 – AStupidNoob 2010-08-07 00:36:09

+0

然后hWnd是_still_有效吗? – JustBoo 2010-08-07 13:41:40