6

我们最近从VS 2005( VS 2008Windows XP) 升级。我们SlimDx在我们的一个项目中使用。升级后一切正常,除了我的恢复功能,它在设备丢失/设备重置时调用,它会崩溃

D3DERR_INVALIDCALL:无效调用 (-2005530516)

我使用Ctrl- Alt-Del然后Escape模拟设备丢失。

void Recover()
{
  try
     {
         if (res.Code == D3DERR_DEVICENOTRESET)
         { 
           res = m_device.Reset(m_presentParams); //Crashes on this.
           if (res.IsSuccess)
           {
             m_deviceLost = false; 
            }
          }
     }
   catch(Exception e)
   {}
 }

这与VS 2008它过去工作得很好有关VS 2005吗?

4

3 回答 3

9

我在这个论坛帖子中找到了一些有用的信息。请注意该论坛上与 VB 相关的问题,但这仍然是很好的信息。完全归功于Simon O'Connor

重新格式化和稍微编辑。

INVALIDCALL 通常意味着您传递给 D3D 的参数无效或您请求的操作是不可能的。

找出 D3D 调用为什么返回 INVALIDCALL 错误的最简单方法是让它告诉您:

  1. 确保您使用的是已安装 D3D 运行时的 DEBUG 版本(安装 SDK 时为您提供了选项)。
  2. 确保启用了运行时的调试版本。转到控制面板中的 DirectX 小程序并在 Direct3D 选项卡下查看。
  3. 在 DirectX 控制面板小程序中,将 Direct3D 的调试输出级别增加到最大。我已经有 10 多年没有使用 Visual BASIC 了,所以我忘记了可用的调试支持,并且我没有在这台机器上安装它来检查...如果 VB 确实有调试输出窗口:
  4. 运行您的程序并让它因 INVALIDCALL 错误而失败。
  5. 现在查看调试输出窗口中的所有文本。D3D 将记录信息、警告和重要的错误。它还将解释 D3D 调用失败的原因。

如果 VB 没有简单的调试输出窗口,请从http://www.sysinternals.com下载并运行 DebugView或使用 DirectX SDK 附带的命令行调试查看器

于 2010-06-29T05:44:16.170 回答
2

这通常发生在您没有释放所有资源(顶点缓冲区、纹理......)时

于 2012-10-15T17:23:02.140 回答
0
void Recover() 
{ 
   try { 
            if (res.Code == D3DERR_DEVICENOTRESET) 
            { 
                 res = m_device.Reset(m_presentParams); //Crashes on this. 
                 if (res.IsSuccess) 
                 { 
                      m_deviceLost = false; 
                 } 
            } 
   } catch(Exception e) {} 
}
于 2013-07-12T15:07:04.357 回答