DirectInput DirectInput C/C++ 레퍼런스 인터페이스 IDirectInputDevice8 GetDeviceData   [목차열람] [주소복사] [슬롯비우기]
IDirectInputDevice8::GetDeviceData 메서드
 
Microsoft DirectX 9.0

IDirectInputDevice8::GetDeviceData 메서드


장치로부터 버퍼링 데이터를 얻어온다.

구문

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 ,폴링과 이벤트 통지


© 2002 Microsoft Corporation. All rights reserved.
↑TOP