DirectX 9.0c - błąd wywołania funcji CreateDevice oraz DestroyDevice

DirectX 9.0c - błąd wywołania funcji CreateDevice oraz DestroyDevice
patryj1083
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 6 lat
  • Postów:102
0

Witam.Mam problem z funkcją która zajmuje się utworzeniem urządzenia oraz z usunięciem go przy zamykaniu programu. Proszę o jakąś wskazówkę.
Wzorowałem się na podstawie dokumentacji DirectX oraz na WARP'ach.

Kopiuj
HRESULT CFramework::CreateDevice()
{
	D3DPRESENT_PARAMETERS PresentParam;
	if(FAILED( GeneratePresentParams(&PresentParam)))
		MessageBox(m_hWnd,L"Błąd. Nie można wywołać funkcji\nGeneratePresentParams",NULL,MB_OK | MB_ICONERROR);
	

	HRESULT hr;
	hr = m_pD3d>CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,m_hWnd,
	D3DCREATE_SOFTWARE_VERTEXPROCESSING,&PresentParam,&m_pD3dDevice);
	if(FAILED(hr)) return E_FAIL;
	hr = m_pD3d>CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,m_hWnd,
	D3DCREATE_MIXED_VERTEXPROCESSING,&PresentParam,&m_pD3dDevice);
	if(FAILED(hr)) return E_FAIL;
	hr = m_pD3d>CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,m_hWnd,
	D3DCREATE_HARDWARE_VERTEXPROCESSING,&PresentParam,&m_pD3dDevice);
	if(FAILED(hr)) return E_FAIL;

	return S_OK;
}//end CreateDevice


HRESULT CFramework::DestroyDirect3D()
{
	if(m_pD3d) m_pD3d->Release();

	if(m_pD3d) return E_FAIL;

	return S_OK;
}//end DestroyDirect3D

int CFramework::Go()
{
	InitCommonControls();

	if(FAILED(CreateDirect3D()))
		MessageBox(m_hWnd,L"Błąd CreateDirect3D",NULL,MB_OK | MB_ICONERROR);

	if(FAILED(RegisterClass_()))
		MessageBox(m_hWnd,L"Błąd RegisterClass",NULL,MB_OK | MB_ICONERROR);

	if(FAILED(CreateWindow_()))
		MessageBox(m_hWnd,L"Błąd CreateWindow",NULL,MB_OK | MB_ICONERROR);
	
	if(FAILED(CreateDevice()))
		MessageBox(m_hWnd,L"Błąd CreateDevice",NULL,MB_OK | MB_ICONERROR);
	
	return Loop();
}//end Go
 

Dzięki z góry.:)

Ola Nordmann
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 8 lat
  • Postów:414
0

A gdzie tworzysz: m_pD3d
i co to za operator: >
???


<img src="http://scontent-a-vie.xx.fbcdn.net/hphotos-ash3/1379478_311850692288742_1730250652_n.jpg" />
Geniusz zua :>
edytowany 1x, ostatnio: Ola Nordmann
patryj1083
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 6 lat
  • Postów:102
0

W klasie CFramework, a m_pD3D jest typu LPDIRECT3D9.

Ola Nordmann
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 8 lat
  • Postów:414
0

Domyślam się. Jakiego jest typy, ale gdzie jest pobierany? Gdzie wywołujesz tą funkcje:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb219685(v=vs.85).aspx

I co to za operatory:

Kopiuj
 hr = m_pD3d>CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,m_hWnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,&PresentParam,&m_pD3dDevice);
Kopiuj
 hr = m_pD3d>CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,m_hWnd,
Kopiuj
m_pD3d>CreateDevice
Kopiuj
>

<img src="http://scontent-a-vie.xx.fbcdn.net/hphotos-ash3/1379478_311850692288742_1730250652_n.jpg" />
Geniusz zua :>
edytowany 2x, ostatnio: Ola Nordmann
patryj1083
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 6 lat
  • Postów:102
0

Funkcje są wywoływane w funkcji Go a tu "m_pD3d>CreateDevice" to po prostu literówka.

Ola Nordmann
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 8 lat
  • Postów:414
0

To poraw tą literówkę.
Pokaż mi jak pobierasz interfejs IDirect3D9.
Pokaż jaki dokładnie błąd dostajesz - dokładny kod HRESULT i miejsce wystąpienia.

Mam zgadywać? Zgaduje, że ta literówka dużo namieszała - nie wywoływałeś funkcji, tylko sprawdzałeś, czy m_pD3d > UNDEFINED.


<img src="http://scontent-a-vie.xx.fbcdn.net/hphotos-ash3/1379478_311850692288742_1730250652_n.jpg" />
Geniusz zua :>
patryj1083
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 6 lat
  • Postów:102
0

Najlepiej sama zobacz co i jak . O ile ci się chce.
http://speedy.sh/VcXcw/Framework-Application.zip

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:2 minuty
0

if(m_pD3d) m_pD3d->Release();

    if(m_pD3d) return E_FAIL;

Release nie ustawi ci wskaźnika na NULL, więc ten drugi warunek jest bez sensu.

patryj1083
Dzięki za uwagę.
Ola Nordmann
Jak to jest wywoływane tylko w destruktorze to nie ma sensu ustawiać wskaźnik na NULL.
patryj1083
Nie używam destruktorów i przypisanie NULL pomogło.
Ola Nordmann
On faktycznie nie ma tam nawet jawnie zadeklarowanego destruktora, a co dopiero jego definicja :). Jak chcesz pracować nad grami to lepiej zacznij używać destruktorów - zaoszczędzają masę czasu, roboty i włosów na głowie.
patryj1083
Jeszcze się przyzwyczajam do obiektowości, i wielkie dzięki za radę.:)
Ola Nordmann
W takim razie może odpuść sobie DX na razie. Napisz własny, mniejszy projekt zorientowany obiektowo, pobaw się wzorcami projektowymi i dowiedz się dokładnie co to jest i jak działa COM, bo na tym jest oparty DX i masa Windowsowskiego ścierwa. :)
Ola Nordmann
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 8 lat
  • Postów:414
0

Po pierwsze - popraw te nazwy funkcji:

Kopiuj
HRESULT CFramework::CreateWindow_()
Kopiuj
HRESULT CFramework::RegisterClass_()

Wiem, że Windows się rozpanoszył jeśli o to chodzi, ale możesz wymyśleć coś innego, albo odwoływać się do tego przez przestrzeń nazw.
Radzę poczytać o D3D Device Caps, bo nigdzie nie sprawdzasz możliwości Twojego sprzętu. Jeśli odpali się na software to znaczy, że przesadziłeś z jakimś parametrem. Nie mam niestety czasu tego uruchamiać, ale na pierwszy rzut oka to jest najprawdopodobniejsza przyczyna problemu.


<img src="http://scontent-a-vie.xx.fbcdn.net/hphotos-ash3/1379478_311850692288742_1730250652_n.jpg" />
Geniusz zua :>

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.