다음을 통해 공유


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를 반환합니다. 가능한 값에는 다음 표에 있는 값이 포함되지만, 이에 국한되는 것은 아닙니다.

반환 코드 Description
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를 호출하는 다른 스레드에서 대기하는 경우 교착 상태가 됩니다. 스레드가 그 사이에 UnlockDevice를 호출하지 않고 LockDevice를 두 번 호출하는 경우에도 교착 상태가 됩니다.

예제

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