Método IDirect3DDeviceManager9::LockDevice (dxva2api.h)

Fornece ao chamador acesso exclusivo ao dispositivo Direct3D.

Sintaxe

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

Parâmetros

[in] hDevice

Um identificador para o dispositivo Direct3D. Para obter o identificador do dispositivo, chame IDirect3DDeviceManager9::OpenDeviceHandle.

[out] ppDevice

Recebe um ponteiro para a interface IDirect3DDevice9 do dispositivo.

[in] fBlock

Especifica se o bloqueio do dispositivo deve ser aguardado. Se o dispositivo já estiver bloqueado e esse parâmetro for TRUE, o método será bloqueado até que o dispositivo seja desbloqueado. Caso contrário, se o dispositivo estiver bloqueado e esse parâmetro for FALSE, o método retornará imediatamente com o código de erro DXVA2_E_VIDEO_DEVICE_LOCKED.

Valor retornado

O método retorna um HRESULT. Os possíveis valores incluem, mas sem limitação, aqueles na tabela a seguir.

Código de retorno Descrição
S_OK
O método foi bem-sucedido.
DXVA2_E_NEW_VIDEO_DEVICE
O identificador do dispositivo é inválido.
DXVA2_E_NOT_INITIALIZED
O gerenciador de dispositivos Direct3D não foi inicializado. O proprietário do dispositivo deve chamar IDirect3DDeviceManager9::ResetDevice.
DXVA2_E_VIDEO_DEVICE_LOCKED
O dispositivo está bloqueado e fBlock é FALSE.
E_HANDLE
O identificador especificado não é um identificador de dispositivo Direct3D.

Comentários

Quando terminar de usar o dispositivo Direct3D, chame IDirect3DDeviceManager9::UnlockDevice para desbloquear o dispositivo.

Se o método retornar DXVA2_E_NEW_VIDEO_DEVICE, chame IDirect3DDeviceManager9::CloseDeviceHandle para fechar o identificador e, em seguida, chame OpenDeviceHandle novamente para obter um novo identificador. O método IDirect3DDeviceManager9::ResetDevice invalida todos os identificadores de dispositivo abertos.

Se fBlock for TRUE, esse método poderá potencialmente ficar em deadlock. Por exemplo, ele fará deadlock se um thread chamar LockDevice e aguardar em outro thread que chame LockDevice. Ele também será deadlock se um thread chamar LockDevice duas vezes sem chamar UnlockDevice entre eles.

Exemplos

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;
}

Requisitos

   
Cliente mínimo com suporte Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho dxva2api.h

Confira também

Direct3D Gerenciador de Dispositivos

IDirect3DDeviceManager9