IDirectInputDevice8::GetDeviceData メソッド

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ポーリングとイベント通知