2010-03-23 29 views
5

Wir aktualisierten vor kurzem von VS 2005 zu VS 2008 (Windows XP). Wir verwenden SlimDx in einem unserer Projekte. Alle funktionieren ok nach dem Upgrade, außer meine Recover-Funktion, die auf devicelost/Geräte-Reset aufgerufen wird, die mitSlimDX Device.Reset stürzt mit einem "D3DERR_INVALIDCALL: Ungültiger Anruf (-2005530516)" Fehler

D3DERR_INVALIDCALL stürzt: Unzulässiger Aufruf (-2005530516)

Ich benutze Ctrl - Alt - Del und dann Escape, Gerät verloren zu simulieren.

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

Ist das etwas mit VS 2008, zu tun, wie es mit VS 2005 schön gearbeitet?

+0

Alles in der Debug-Spuck, die Ihnen hilft? – Goz

+0

Eine schnelle Suche nach "D3DERR_INVALIDCALL Reset" führt zu MSDN. "Der Methodenaufruf ist ungültig. Beispielsweise kann der Parameter einer Methode einen ungültigen Wert haben." Also mein Vorschlag wäre, m_presentParams zu überprüfen, enthält es die Informationen, die Sie erwarten? –

+3

gelöst: einige der Ressourcen (Stateblocks) wurden nicht entsorgt. – ababeel

Antwort

8

Ich fand einige hilfreiche Informationen in this forum post. Beachten Sie die Frage zu diesem Forum in Bezug auf VB, aber das ist immer noch eine gute Information. Volle Gutschrift an Simon O'Connor.

Neuformatiert und leicht bearbeitet.

INVALIDCALL bedeutet normalerweise, dass entweder ein Parameter, den Sie an D3D übergeben haben, ungültig ist oder eine Operation, die Sie angefordert haben, nicht möglich ist.

Der einfachste Weg, um herauszufinden, warum ein D3D Anruf ein INVALIDCALL Fehler zurückgegeben wird, ist es Ihnen zu lassen sagen:

  1. Stellen Sie sicher, dass die Debug-Version des D3D Laufzeit verwenden installiert ist (Sie erhalten haben die Option bei der Installation des SDK).
  2. Stellen Sie sicher, dass die DEBUG-Version der Laufzeitumgebung aktiviert ist. Rufen Sie das DirectX-Applet in der Systemsteuerung auf und suchen Sie unter der Registerkarte Direct3D.
  3. Erhöhen Sie im DirectX-Steuerungsfeld-Applet den Debug-Ausgabepegel für Direct3D auf den Maximalwert. Ich habe Visual Basic seit über 10 Jahren nicht mehr verwendet, also habe ich vergessen, welche Debugging-Unterstützung verfügbar ist und ich habe es nicht installiert auf diesem Rechner zu prüfen ... Wenn VB ein Debug-Ausgabefenster hat:
  4. Führen Sie Ihr Programm aus und lassen Sie es mit dem INVALIDCALL-Fehler fehlschlagen.
  5. Schauen Sie sich jetzt den gesamten Text in Ihrem Debug-Ausgabefenster an. D3D wird Informationen, Warnungen und vor allem Fehler protokollieren. Es erklärt auch den Grund, warum ein D3D-Anruf fehlgeschlagen ist.

Wenn VB keine einfache Debug-Ausgabefenster haben, herunterladen und ausführen Debugview von http://www.sysinternals.com oder die Befehlszeile Debug-Viewer verwenden, die mit dem DirectX SDK

+0

Alter, op löste das Problem vor langer Zeit. Siehe die Kommentare ("einige der Ressourcen (Stateblocks) wurden nicht entsorgt"). – SigTerm

+4

@SigTerm, yep In meinem Fall hat das nichts mit Stateblocks zu tun. Dies ist eine generische Fehlermeldung, aber dieser SO-Post hat ein hohes Google-Ranking für den Fehlercode, also habe ich diese Antwort in der Hoffnung gestellt, dass sie jemand anderem helfen könnte über eine Suche. –

1

kommt Das geschieht in der Regel, wenn Sie didn‘ t entsorgen Sie alle Ihre Ressourcen (Vertex-Puffer, Textur, ...)

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