Метод IDirect3DDeviceManager9::LockDevice (dxva2api.h)

Предоставляет вызывающей объекту монопольный доступ к устройству Direct3D.

Синтаксис

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

Параметры

[in] hDevice

Дескриптор устройства Direct3D. Чтобы получить дескриптор устройства, вызовите IDirect3DeviceManager9::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
Устройство заблокировано, а fBlock имеет значение FALSE.
E_HANDLE
Указанный дескриптор не является дескриптором устройства Direct3D.

Комментарии

Завершив работу с устройством Direct3D, вызовите IDirect3DDeviceManager9::UnlockDevice , чтобы разблокировать устройство.

Если метод возвращает DXVA2_E_NEW_VIDEO_DEVICE, вызовите IDirect3DeviceManager9::CloseDeviceHandle , чтобы закрыть дескриптор, а затем снова вызовите OpenDeviceHandle , чтобы получить новый дескриптор. Метод IDirect3DDeviceManager9::ResetDevice делает недействительными все открытые дескрипторы устройств.

Если fBlock имеет значение TRUE, этот метод потенциально может быть взаимоблокировкой. Например, он будет взаимоблокирован, если поток вызывает LockDevice , а затем ожидает другого потока, который вызывает LockDevice. Он также будет взаимоблокирован, если поток вызывает LockDevice дважды, не вызывая UnlockDevice между ними.

Примеры

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
Header dxva2api.h

См. также раздел

Диспетчер устройств Direct3D

IDirect3DDeviceManager9