Share via


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