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

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.

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.:)

0

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

0

W klasie CFramework, a m_pD3D jest typu LPDIRECT3D9.

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:

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

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

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.

0

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

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.

0

Po pierwsze - popraw te nazwy funkcji:

HRESULT CFramework::CreateWindow_()
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1