2010-03-23 8 views
5

Recentemente abbiamo aggiornato VS 2005-VS 2008 (Windows XP). Usiamo SlimDx in uno dei nostri progetti. Tutto stava funzionando ok dopo l'aggiornamento, tranne il mio Recuperare funzione, che viene chiamato il ripristino devicelost/dispositivo che blocca conSlimDX Device.Reset blocca con un "D3DERR_INVALIDCALL: chiamata non valido (-2.005,530516 millions)" Errore

D3DERR_INVALIDCALL: chiamata non valido (-2005530516)

io uso Ctrl - Alt - Del e quindi Fuga per simulare il dispositivo perso.

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

è questo qualcosa a che fare con VS 2008, come è abituato a lavorare bene con VS 2005?

+0

Qualcosa nel debug di stampa che ti aiuta? – Goz

+0

Una ricerca rapida per "Reset D3DERR_INVALIDCALL" porta a MSDN. "La chiamata al metodo non è valida. Ad esempio, il parametro di un metodo può avere un valore non valido." Quindi il mio suggerimento sarebbe quello di verificare m_presentParams, contiene le informazioni che ci si aspetta? –

+3

risolto: alcune delle risorse (blocchi di stato) non erano disposte. – ababeel

risposta

8

Ho trovato alcune informazioni utili in this forum post. Nota la domanda su quel forum relativo a VB ma questa è ancora una buona informazione. Credito completo a Simon O'Connor.

Riformattato e modificato leggermente.

INVALIDCALL di solito significa che un parametro che hai trasmesso a D3D non è valido o un'operazione che hai richiesto non è possibile.

Il modo più semplice per scoprire il motivo per cui una chiamata D3D restituito un errore INVALIDCALL è quello di lasciare che dirvi:

  1. Assicurarsi che si sta utilizzando la versione di debug del runtime D3D è installato (è stata data l'opzione quando hai installato l'SDK).
  2. Assicurarsi che la versione DEBUG del runtime sia abilitata. Vai all'applet DirectX nel pannello di controllo e guarda sotto la scheda Direct3D.
  3. Mentre nell'applet del pannello di controllo di DirectX, aumentare al massimo il livello di uscita di debug per Direct3D. Non uso Visual BASIC da oltre 10 anni, quindi ho dimenticato quale supporto per il debug è disponibile e non ho installato su questa macchina per controllare ... Se VB ha una finestra di output di debug:
  4. Esegui il tuo programma e fallo fallire con l'errore INVALIDCALL.
  5. Ora guarda tutto il testo nella finestra di output di debug. D3D registrerà informazioni, avvertimenti e, soprattutto, errori. Spiegherà anche il motivo PERCHÉ è fallita una chiamata D3D.

Se VB non ha una semplice finestra output di debug, scaricare ed eseguire DebugView da http://www.sysinternals.com o utilizzare il visualizzatore di debug riga di comando che viene fornito con il DirectX SDK

+0

amico, op ha risolto il problema molto tempo fa.Vedi i commenti ("alcune delle risorse (blocchi di stato) non erano disposte") – SigTerm

+4

@SigTerm, sì Nel mio caso non ha nulla a che fare con i blocchi di stato Questo è un messaggio di errore generico, ma questo post SO ha un alto ranking di google per il codice di errore, quindi ho posto questa risposta nella speranza che possa aiutare qualcun altro a venire tramite una ricerca. –

1

Questo di solito accade quando si didn' t dispose tutte le tue risorse (vertex buffer, texture, ...)

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