Метод 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. Допустимые значения включают, но не ограничиваются, значения, приведенные в следующей таблице.
Код возврата | Описание |
---|---|
|
Метод выполнен успешно. |
|
Недопустимый дескриптор устройства. |
|
Диспетчер устройств Direct3D не инициализирован. Владелец устройства должен вызвать IDirect3DDeviceManager9::ResetDevice. |
|
Устройство заблокировано, а fBlock имеет значение FALSE. |
|
Указанный дескриптор не является дескриптором устройства 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 |