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。 |
|
设备已锁定, fBlock 为 FALSE。 |
|
指定的句柄不是 Direct3D 设备句柄。 |
备注
使用完 Direct3D 设备后,请调用 IDirect3DDeviceManager9::UnlockDevice 以解锁到该设备。
如果方法返回 DXVA2_E_NEW_VIDEO_DEVICE,请调用 IDirect3DDeviceManager9::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 |
标头 | dxva2api.h |