次の方法で共有


IDirect3DDeviceManager9::LockDevice メソッド (dxva2api.h)

呼び出し元に Direct3D デバイスへの排他的アクセス権を付与します。

構文

HRESULT LockDevice(
  [in]  HANDLE           hDevice,
  [out] IDirect3DDevice9 **ppDevice,
  [in]  BOOL             fBlock
);

パラメーター

[in] hDevice

Direct3D デバイスへのハンドル。 デバイス ハンドルを取得するには、 IDirect3DDeviceManager9::OpenDeviceHandle を呼び出します。

[out] ppDevice

デバイスの IDirect3DDevice9 インターフェイスへのポインターを受け取ります。

[in] fBlock

デバイス ロックを待機するかどうかを指定します。 デバイスが既にロックされていて、このパラメーターが TRUE の場合、メソッドはデバイスのロックが解除されるまでブロックします。 それ以外の場合、デバイスがロックされていて、このパラメーターが FALSE の場合、メソッドはエラー コード DXVA2_E_VIDEO_DEVICE_LOCKEDを使用して直ちにを返します。

戻り値

このメソッドは HRESULT を返します。 有効な値を次の表に示しますが、これ以外にもあります。

リターン コード 説明
S_OK
メソッドが成功しました。
DXVA2_E_NEW_VIDEO_DEVICE
デバイス ハンドルが無効です。
DXVA2_E_NOT_INITIALIZED
Direct3D デバイス マネージャーが初期化されませんでした。 デバイスの所有者は 、IDirect3DDeviceManager9::ResetDevice を呼び出す必要があります。
DXVA2_E_VIDEO_DEVICE_LOCKED
デバイスがロックされ、 fBlockFALSE です
E_HANDLE
指定したハンドルは Direct3D デバイス ハンドルではありません。

解説

Direct3D デバイスの使用が完了したら、 IDirect3DDeviceManager9::UnlockDevice を呼び出してデバイスのロックを解除します。

メソッドが DXVA2_E_NEW_VIDEO_DEVICEを返す場合は、 IDirect3DDeviceManager9::CloseDeviceHandle を呼び出してハンドルを閉じ、もう一度 OpenDeviceHandle を呼び出して新しいハンドルを取得します。 IDirect3DDeviceManager9::ResetDevice メソッドは、開いているすべてのデバイス ハンドルを無効にします。

fBlockTRUE の場合、このメソッドはデッドロックの可能性があります。 たとえば、スレッドが LockDevice を呼び出し、LockDevice を呼び出す別のスレッドで待機すると、デッドロック が発生します。 また、スレッドが UnlockDevice を呼び出さずに LockDevice を 2 回呼び出した場合にもデッドロックが発生します。

HRESULT LockDevice(
    IDirect3DDeviceManager9 *pDeviceManager,
    BOOL fBlock,
    IDirect3DDevice9 **ppDevice, // Receives a pointer to the device.
    HANDLE *pHandle              // Receives a device handle.   
    )
{
    *pHandle = NULL;
    *ppDevice = NULL;

    HANDLE hDevice = 0;

    HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice);

    if (SUCCEEDED(hr))
    {
        hr = pDeviceManager->LockDevice(hDevice, ppDevice, fBlock);
    }

    if (hr == DXVA2_E_NEW_VIDEO_DEVICE)
    {
        // Invalid device handle. Try to open a new device handle.
        hr = pDeviceManager->CloseDeviceHandle(hDevice);

        if (SUCCEEDED(hr))
        {
            hr = pDeviceManager->OpenDeviceHandle(&hDevice);
        }

        // Try to lock the device again.
        if (SUCCEEDED(hr))
        {
            hr = pDeviceManager->LockDevice(hDevice, ppDevice, TRUE); 
        }
    }

    if (SUCCEEDED(hr))
    {
        *pHandle = hDevice;
    }
    return hr;
}

要件

   
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー dxva2api.h

関連項目

Direct3D デバイス マネージャー

IDirect3DDeviceManager9