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

Proporciona al autor de la llamada acceso exclusivo al dispositivo Direct3D.

Sintaxis

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

Parámetros

[in] hDevice

Identificador del dispositivo Direct3D. Para obtener el identificador del dispositivo, llame a IDirect3DDeviceManager9::OpenDeviceHandle.

[out] ppDevice

Recibe un puntero a la interfaz IDirect3DDevice9 del dispositivo.

[in] fBlock

Especifica si se debe esperar el bloqueo del dispositivo. Si el dispositivo ya está bloqueado y este parámetro es TRUE, el método se bloquea hasta que se desbloquea el dispositivo. De lo contrario, si el dispositivo está bloqueado y este parámetro es FALSE, el método devuelve inmediatamente con el código de error DXVA2_E_VIDEO_DEVICE_LOCKED.

Valor devuelto

El método devuelve un valor HRESULT. Entre los valores posibles se incluyen los que se indican en la tabla siguiente, entre otros.

Código devuelto Descripción
S_OK
El método se ha llevado a cabo de forma correcta.
DXVA2_E_NEW_VIDEO_DEVICE
El identificador del dispositivo no es válido.
DXVA2_E_NOT_INITIALIZED
El administrador de dispositivos direct3D no se inicializó. El propietario del dispositivo debe llamar a IDirect3DDeviceManager9::ResetDevice.
DXVA2_E_VIDEO_DEVICE_LOCKED
El dispositivo está bloqueado y fBlock es FALSE.
E_HANDLE
El identificador especificado no es un identificador de dispositivo Direct3D.

Comentarios

Cuando haya terminado de usar el dispositivo Direct3D, llame a IDirect3DDeviceManager9::UnlockDevice para desbloquear en el dispositivo.

Si el método devuelve DXVA2_E_NEW_VIDEO_DEVICE, llame a IDirect3DDeviceManager9::CloseDeviceHandle para cerrar el identificador y, a continuación, llame a OpenDeviceHandle de nuevo para obtener un nuevo identificador. El método IDirect3DDeviceManager9::ResetDevice invalida todos los identificadores de dispositivo abiertos.

Si fBlock es TRUE, este método puede potencialmente interbloquear. Por ejemplo, se interbloqueará si un subproceso llama a LockDevice y, a continuación, espera en otro subproceso que llama a LockDevice. También se interbloqueará si un subproceso llama a LockDevice dos veces sin llamar a UnlockDevice entre sí.

Ejemplos

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 compatible Windows Vista [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2008 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado dxva2api.h

Consulte también

Direct3D Administrador de dispositivos

IDirect3DDeviceManager9