Partager via


IDirect3DDeviceManager9::LockDevice, méthode (dxva2api.h)

Donne à l’appelant un accès exclusif à l’appareil Direct3D.

Syntaxe

HRESULT LockDevice(
  [in]  HANDLE           hDevice,
  [out] IDirect3DDevice9 **ppDevice,
  [in]  BOOL             fBlock
);

Paramètres

[in] hDevice

Handle pour l’appareil Direct3D. Pour obtenir le handle d’appareil, appelez IDirect3DDeviceManager9::OpenDeviceHandle.

[out] ppDevice

Reçoit un pointeur vers l’interface IDirect3DDevice9 de l’appareil .

[in] fBlock

Spécifie s’il faut attendre le verrouillage de l’appareil. Si l’appareil est déjà verrouillé et que ce paramètre a la valeur TRUE, la méthode se bloque jusqu’à ce que l’appareil soit déverrouillé. Sinon, si l’appareil est verrouillé et que ce paramètre a la valeur FALSE, la méthode retourne immédiatement avec le code d’erreur DXVA2_E_VIDEO_DEVICE_LOCKED.

Valeur retournée

Cette méthode retourne un code HRESULT. Les valeurs possibles sont notamment celles figurant dans le tableau suivant.

Code de retour Description
S_OK
S_OK
DXVA2_E_NEW_VIDEO_DEVICE
Le handle d’appareil n’est pas valide.
DXVA2_E_NOT_INITIALIZED
Le gestionnaire de périphériques Direct3D n’a pas été initialisé. Le propriétaire de l’appareil doit appeler IDirect3DDeviceManager9::ResetDevice.
DXVA2_E_VIDEO_DEVICE_LOCKED
L’appareil est verrouillé et fBlock a la valeur FALSE.
E_HANDLE
Le handle spécifié n’est pas un handle d’appareil Direct3D.

Notes

Lorsque vous avez terminé d’utiliser l’appareil Direct3D, appelez IDirect3DDeviceManager9::UnlockDevice pour déverrouiller l’appareil.

Si la méthode retourne DXVA2_E_NEW_VIDEO_DEVICE, appelez IDirect3DDeviceManager9::CloseDeviceHandle pour fermer le handle, puis appelez à nouveau OpenDeviceHandle pour obtenir un nouveau handle. La méthode IDirect3DDeviceManager9::ResetDevice invalide tous les descripteurs d’appareil ouverts.

Si fBlock a la valeur TRUE, cette méthode peut potentiellement se bloquer. Par exemple, il se bloque si un thread appelle LockDevice , puis attend sur un autre thread qui appelle LockDevice. Elle interbloque également si un thread appelle LockDevice deux fois sans appeler UnlockDevice entre les deux.

Exemples

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;
}

Spécifications

   
Client minimal pris en charge Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2008 [applications de bureau uniquement]
Plateforme cible Windows
En-tête dxva2api.h

Voir aussi

Gestionnaire de périphériques Direct3D

IDirect3DDeviceManager9