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。 可能的值包括(但并不限于)下表中的项。

返回代码 说明
S_OK
方法成功。
DXVA2_E_NEW_VIDEO_DEVICE
设备句柄无效。
DXVA2_E_NOT_INITIALIZED
未初始化 Direct3D 设备管理器。 设备的所有者必须调用 IDirect3DDeviceManager9::ResetDevice
DXVA2_E_VIDEO_DEVICE_LOCKED
设备已锁定, fBlockFALSE
E_HANDLE
指定的句柄不是 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 [仅限桌面应用]
目标平台 Windows
标头 dxva2api.h

请参阅

Direct3D 设备管理器

IDirect3DDeviceManager9