2010-03-23 9 views
5

Niedawno zaktualizowaliśmy wersję z VS 2005 do VS 2008 (Windows XP). Używamy SlimDx w jednym z naszych projektów. Wszystko działa ok, po aktualizacji, z wyjątkiem mojego Odzyskaj funkcji, która jest wywoływana na resecie devicelost/urządzenie, które zderza się zUrządzenie SlimDX.Reset zawiesza się z komunikatem "D3DERR_INVALIDCALL: Invalid call (-2005530516)"

D3DERR_INVALIDCALL: Nieprawidłowe wywołanie (-2005530516)

używam Ctrl - Alt - Del a następnie Escape do symulacji utraconego urządzenia.

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

Czy to ma coś wspólnego z VS 2008, jak kiedyś ładnie pracować z VS 2005?

+0

Cokolwiek w spluwie debugowania, które pomaga? – Goz

+0

Szybkie wyszukiwanie "D3DERR_INVALIDCALL Reset" prowadzi do MSDN. "Wywołanie metody jest nieprawidłowe. Na przykład parametr metody może mieć niepoprawną wartość."Tak więc moja sugestia polegałaby na sprawdzeniu m_presentParams, czy zawiera ona informacje, których się spodziewasz? –

+3

rozwiązano: niektóre zasoby (stateblocks) nie były usuwane – ababeel

Odpowiedz

8

Znalazłem przydatne informacje w this forum post. Zauważ pytanie na tym forum związane z VB, ale to nadal jest dobra informacja. Pełny kredyt na Simon O'Connor.

Przeformatowano i nieznacznie edytowano.

INVALIDCALL oznacza zazwyczaj, że parametr przekazany do D3D jest nieprawidłowy lub operacja, o którą prosiłeś, nie jest możliwa.

Najprostszym sposobem, aby dowiedzieć się, dlaczego wezwanie D3D zwrócony błąd INVALIDCALL to niech to wam powiedzieć:

  1. Upewnij się, że używasz wersji debug runtime D3D jest zainstalowany (wy dano opcja po zainstalowaniu SDK).
  2. Upewnij się, że włączona jest wersja środowiska wykonawczego DEBUG. Przejdź do apletu DirectX w Panelu sterowania i spójrz na zakładkę Direct3D.
  3. Podczas korzystania z apletu panelu sterowania DirectX, zwiększ poziom wyjściowy debugowania dla Direct3D do maksimum. Nie używam Visual Basic przez ponad 10 lat, więc zapomniałem, jakie wsparcie dla debugowania jest dostępne i nie mam go zainstalowanego na tym komputerze, aby sprawdzić ... Jeśli VB DOES ma okno wyjściowe debugowania:
  4. Uruchom swój program i pozwól mu zawieść z błędem INVALIDCALL.
  5. Teraz spójrz na cały tekst w oknie wyjściowym debugowania. D3D będzie rejestrować informacje, ostrzeżenia i ważne błędy w tym zakresie. Wyjaśni to również powód DLACZEGO połączenie D3D nie powiodło się.

Jeśli VB nie ma prostej okno wyjściowe debugowania, należy pobrać i uruchomić DebugView z http://www.sysinternals.com lub użyć debugowania widza wiersza poleceń, które pochodzi z DirectX SDK

+0

stary, rozwiązał problem dawno temu Zobacz komentarze ("niektóre zasoby (stateblocks) nie zostały usunięte") – SigTerm

+4

@SigTerm, yep W moim przypadku nie ma to nic wspólnego z blokadą stanu.Jest to ogólny komunikat o błędzie, ale ten wpis SO ma wysoki ranking google dla kodu błędu, więc podałem tę odpowiedź w nadziei, że może to pomóc komuś innemu w drodze wyszukiwania. –

1

to zwykle się dzieje, gdy nie zrobił” • wyrzuć wszystkie zasoby (bufor wierzchołków, tekstura, ...)

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) {} 
} 
Powiązane problemy