1

到目前为止,我的程序运行良好。不幸的是,当我按ctrl+ alt+时del,它会引发错误。现在我已经阅读了这个问题:

使用 ctrl alt del 时的 E_ACCESSDENED

其中提到计算机切换到不同的屏幕(您没有任何写入权限)。只是我不知道我在当前屏幕是否有写权限。

我的代码如下所示:

void D3D::StartFrame() {
    HRESULT result;

    result = pDevice->Clear( 0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(FRAME_BG_R,FRAME_BG_G,FRAME_BG_B),0.0f,0 );
    assert( !FAILED( result ) );

    result = pBackBuffer->LockRect( &backRect,NULL,NULL );
    assert( !FAILED( result ) );
}

void D3D::EndFrame() {
    HRESULT result;

    result = pBackBuffer->UnlockRect();
    assert( !FAILED( result ) );

    result = pDevice->Present( NULL,NULL,NULL,NULL );
    assert( !FAILED( result ) );
}

目前我在每一帧都运行“StartFrame()”函数,然后是一些应该在帧期间完成的动作。最后,它将调用解锁绘图矩形的“EndFrame()”函数。

现在发生的错误来自最后一个断言( StartFrame() 断言没有失败?)。我是否应该更改这些函数以返回布尔值,告诉程序是否应该继续?我应该让它停止整个程序(感觉有点奇怪)吗?也许我正在以错误的方式处理矩形锁定(它应该与断言一起使用)吗?

错误:断言失败!- !失败(结果)

任何帮助/建议都将不胜感激!

4

1 回答 1

3

首先,每当您遇到错误时,在做某事之前,甚至在考虑发生了什么之前,您必须检查错误消息的确切内容。

在 DirectX 9 的情况下,您不仅必须检查是否HRESULT变量,还必须FAILED从中获取详细信息。DXGetErrorString()您可以使用和/或DXGetErrorDescription()函数 ( dxerr.h+ dxerr.lib)从中获取详细信息。例如,您可以通过编写一个小的帮助函数来处理错误,该函数接受HRESULT并显示MessageBox()详细信息FAILED。此外,还有一个很好的DXTrace()宏作为快速解决方案。或者,作为一种最快的惰性解决方案,您可以在函数失败后立即设置断点,并HRESULT在调试观察器中检查变量的值。

在你的情况下,因为我们在你的帖子中没有错误描述,我们只能猜测发生了什么(这是来自 SO 的人最不喜欢的)。我怀疑这里的Device Lost状态。当您的应用失去焦点(Alt+tab、Ctrl+Alt+Del 等)时,有时会出现这种状态。为防止崩溃,您必须按照MSDN本简短教程中的说明处理此类异常状态。

当然,我的猜测在这里可能是错误的,因为我不知道到底发生了什么。请添加适当的错误处理并提供其他信息以获得具体帮助。

快乐编码!

于 2013-05-02T05:26:57.927 回答