DirectInput DirectInput C/C++ 레퍼런스 인터페이스 IDirectInputDevice8 GetDeviceData [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
장치로부터 버퍼링 데이터를 얻어온다.
구문
HRESULT GetDeviceData(
DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags );
파라미터
- cbObjectData
- DIOBJECTDATAFORMAT 구조체의 사이즈 (바이트 단위).
- rgdod
- 버퍼링 데이터를 받는 DIDEVICEOBJECTDATA 구조체의 배열. 이 배열의 요소수는,pdwInOut 파라미터의 값과 동일해야 한다. 이 파라미터가 NULL 의 경우, 버퍼링 데이터는 어디에도 저장 되지 않지만, 그 외의 부차 이펙트는 모두 발생한다.
- pdwInOut
- 입력 파라미터는,rgdod 파라미터가 가리키는 배열의 요소수이다. 출력 파라미터는, 실제로 취득된 요소수이다.
- dwFlags
- 데이터의 취득 방법을 제어하는 플래그. 제로 또는 다음의 플래그를 지정한다.
- DIGDD_PEEK
- 버퍼로부터 항목을 삭제하지 않는다. 이 이후의 IDirectInputDevice8::GetDeviceData 호출로, 같은 데이터를 읽어낼 수가 있다. 보통, 데이터는 읽기 후, 버퍼로부터 삭제된다.
반환값
성공했을 경우는, DI_OK 또는 DI_BUFFEROVERFLOW 를 돌려준다.
실패했을 경우는, 다음의 몇개의 에러값을 돌려준다.
DIERR_INPUTLOST 입력 장치에의 액세스가 없어졌다. 재취득해야 한다. DIERR_INVALIDPARAM 무효인 파라미터가, 돌아오는 함수에 건네졌는지, 개체가 그 함수를 호출할 수 있는 상태에 없었다. 이 값은, 표준의 구성 요소 개체 모델 (COM) 반환값인 E_INVALIDARG 에 동일하다. DIERR_NOTACQUIRED 조작은, 장치가 취득되지 않는 한 실행할 수 없다. DIERR_NOTBUFFERED 장치는 버퍼링되지 않다. 버퍼링을 유효하게 하려면 , DIPROP_BUFFERSIZE 프로퍼티를 설정한다. DIERR_NOTINITIALIZED 이 개체는 초기화되지 않다.
주의
주 메서드가 DI_BUFFEROVERFLOW 를 돌려주는 경우,rgdod 배열의 데이터는 잘라 버릴 수 있다.Microsoft® DirectInput® 의 디버그 버전에서는,IDirectInputDevice8::GetDeviceData 에의 호출이 실행되어 장치가 릴리즈되지 않으면 장치 데이터 버퍼에 랜덤 바이트가 송신된다. 랜덤 장치 데이터를 사용하지 않게 하려면 , 항상 DIERR_UNACQUIRED 를 확인한다.
장치 데이터를 얻어온다전에,IDirectInputDevice8::SetDataFormat 메서드와 IDirectInputDevice8::SetProperty 메서드, 또는 IDirectInputDevice8::SetActionMap 메서드를 사용해 데이터 형식과 버퍼 사이즈를 설정해야 한다. 또,IDirectInputDevice8::Acquire 메서드를 사용해 장치를 취득해야 한다.
버퍼가 보관 유지하는 최대 이벤트수는,IDirectInputDevice8::SetProperty 메서드로 설정한 버퍼 사이즈보다 작다.
다음의 예에서는, 버퍼링 데이터 요소를 최대 10 개까지 읽어낸다. 장치 버퍼로부터 데이터를 읽기면서 삭제하고 있다.
DIDEVICEOBJECTDATA rgdod[10]; DWORD dwItems = 10; hres = idirectinputdevice9_GetDeviceData( sizeof(DIDEVICEOBJECTDATA), rgdod, &dwItems, 0); if (SUCCEEDED(hres)) { // dwItems = Number of elements read (could be zero). if (hres == DI_BUFFEROVERFLOW) { // Buffer had overflowed. } }버퍼를 플래시 해, 플래시 한 항목의 수를 얻어오려면,rgdod 파라미터에 NULL,pdwInOut 파라미터에 INFINITE 를 포함한 변수의 포인터를 각각 지정한다. 다음 예는 그방법을 나타내고 있다.
dwItems = INFINITE; hres = idirectinputdevice9_GetDeviceData( pdid, sizeof(DIDEVICEOBJECTDATA), NULL, &dwItems, 0); if (SUCCEEDED(hres)) { // Buffer successfully flushed. // dwItems = Number of elements flushed. if (hres == DI_BUFFEROVERFLOW) { // Buffer had overflowed. } }장치 버퍼중의 요소수를 조사하려면 ,rgdod 파라미터에 NULL,pdwInOut 파라미터에 INFINITE,dwFlags 에 DIGDD_PEEK 를 각각 지정한다. 다음 예는 그방법을 나타내고 있다.
dwItems = INFINITE; hres = idirectinputdevice9_GetDeviceData( pdid, sizeof(DIDEVICEOBJECTDATA), NULL, &dwItems, DIGDD_PEEK); if (SUCCEEDED(hres)) { // dwItems = Number of elements in buffer. if (hres == DI_BUFFEROVERFLOW) { // Buffer overflow occurred; not all data // was successfully captured. } }버퍼 오버플로우가 발생했는지 어떠했는지를 조사하려면 ,rgdod 파라미터에 NULL,pdwInOut 파라미터에 제로를 각각 설정한다. 다음 예는 그방법을 나타내고 있다.
dwItems = 0; hres = idirectinputdevice9_GetDeviceData( pdid, sizeof(DIDEVICEOBJECTDATA), NULL, &dwItems, 0); if (hres == DI_BUFFEROVERFLOW) { // Buffer overflow occurred. }
참조
IDirectInputDevice8::Poll ,폴링과 이벤트 통지