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。 可能的值包括但不限于下表中的值。
返回代码 | 描述 |
---|---|
|
方法成功。 |
|
设备句柄无效。 |
|
Direct3D 设备管理器未初始化。 设备的所有者必须调用 IDirect3DDeviceManager9::ResetDevice。 |
|
设备已锁定,fBlockFALSE。 |
|
指定的句柄不是 Direct3D 设备句柄。 |
言论
使用 Direct3D 设备后,调用 IDirect3DDeviceManager9::UnlockDevice 解锁设备。
如果方法返回 DXVA2_E_NEW_VIDEO_DEVICE,请调用 IDirect3DDeviceManager9::CloseDeviceHandle 关闭句柄,然后再次调用 OpenDeviceHandle 以获取新句柄。 IDirect3DDeviceManager9::ResetDevice 方法会使所有打开的设备句柄失效。
如果 fBlockTRUE,则此方法可能会死锁。 例如,如果线程 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 [仅限桌面应用] |
目标平台 | 窗户 |
标头 | dxva2api.h |