SlimDX Device.Reset使用“D3DERR_INVALIDCALL:无效调用(-2005530516)”崩溃“错误

问题描述:

我们最近从VS 2005升级到VS 2008(Windows XP)。我们在其中一个项目中使用SlimDx。所有在升级后工作正常,除了我恢复功能,这被称为上与SlimDX Device.Reset使用“D3DERR_INVALIDCALL:无效调用(-2005530516)”崩溃“错误

D3DERR_INVALIDCALL崩溃devicelost /设备复位:无效的调用(-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很好地工作?

+0

任何在调试中可以帮助你? – Goz 2010-03-23 09:28:10

+0

快速搜索“D3DERR_INVALIDCALL重置”会导致MSDN。 “方法调用无效,例如,方法的参数可能具有无效值。“ 所以我的建议是检查m_presentParams;它是否包含你期望的信息? – 2010-03-23 23:40:55

+3

解决了:一些资源(stateblocks)没有被处置 – ababeel 2010-03-24 03:38:31

我在this forum post找到了一些有用的信息。注意与VB相关的论坛上的问题,但这仍然是一个很好的信息。完全抵免Simon O'Connor

重新格式化并稍微编辑。

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

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

  1. 确保您使用D3D运行时的调试版本安装(给您提供当您安装SDK时的选项)。
  2. 确保启用了运行时的DEBUG版本。转到控制面板中的DirectX小程序,然后在Direct3D选项卡下查找。
  3. 在DirectX控制面板小程序中,将Direct3D的调试输出级别提高到最大值。 我没有使用Visual BASIC超过10年,所以我忘记了什么调试支持可用,我没有安装在这台机器上检查...如果VB有一个调试输出窗口:
  4. 运行你的程序,并让INVALIDCALL错误失败。
  5. 现在查看调试输出窗口中的所有文本。 D3D会记录信息,警告和重要的错误。它也会解释为什么D3D调用失败的原因。

当你没如果VB没有一个简单的调试输出窗口,请下载并运行http://www.sysinternals.com DebugView中或使用自带的DirectX SDK

+0

老兄,op很久以前解决了这个问题,请参阅评论(“某些资源(stateblocks)没有配置”) – SigTerm 2010-06-29 05:51:34

+4

@SigTerm,yep ,在我的情况下,它与stateblocks无关,这是一个通用的错误消息,但是这个SO帖子在错误代码中的谷歌排名很高,所以我提出了这个答案,希望它可以帮助别人来通过搜索进入。 – 2010-06-29 06:41:59

命令行调试观众这通常发生” t处理你所有的资源(顶点缓冲区,纹理,...)

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) {} 
}