IDirect3DDeviceManager9::LockDevice-Methode (dxva2api.h)

Gewährt dem Aufrufer exklusiven Zugriff auf das Direct3D-Gerät.

Syntax

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

Parameter

[in] hDevice

Ein Handle für das Direct3D-Gerät. Rufen Sie zum Abrufen des Gerätehandles IDirect3DDeviceManager9::OpenDeviceHandle auf.

[out] ppDevice

Empfängt einen Zeiger auf die IDirect3DDevice9-Schnittstelle des Geräts.

[in] fBlock

Gibt an, ob auf die Gerätesperre gewartet werden soll. Wenn das Gerät bereits gesperrt ist und dieser Parameter TRUE ist, blockiert die Methode, bis das Gerät entsperrt wird. Andernfalls gibt die Methode sofort mit dem Fehlercode DXVA2_E_VIDEO_DEVICE_LOCKED zurück, wenn das Gerät gesperrt ist und dieser Parameter FALSE ist.

Rückgabewert

Die Methode gibt ein HRESULT zurück. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle.

Rückgabecode BESCHREIBUNG
S_OK
Die Methode wurde erfolgreich ausgeführt.
DXVA2_E_NEW_VIDEO_DEVICE
Das Gerätehandle ist ungültig.
DXVA2_E_NOT_INITIALIZED
Der Direct3D-Geräte-Manager wurde nicht initialisiert. Der Besitzer des Geräts muss IDirect3DDeviceManager9::ResetDevice aufrufen.
DXVA2_E_VIDEO_DEVICE_LOCKED
Das Gerät ist gesperrt, und fBlock ist FALSE.
E_HANDLE
Das angegebene Handle ist kein Direct3D-Gerätehandle.

Hinweise

Wenn Sie mit dem Direct3D-Gerät fertig sind, rufen Sie IDirect3DDeviceManager9::UnlockDevice auf, um das Gerät zu entsperren.

Wenn die Methode DXVA2_E_NEW_VIDEO_DEVICE zurückgibt, rufen Sie IDirect3DDeviceManager9::CloseDeviceHandle auf, um das Handle zu schließen, und rufen Sie dann OpenDeviceHandle erneut auf, um ein neues Handle abzurufen. Mit der IDirect3DDeviceManager9::ResetDevice-Methode werden alle geöffneten Gerätehandles ungültig.

Wenn fBlockTRUE ist, kann diese Methode möglicherweise einen Deadlock aufweisen. Beispielsweise wird ein Deadlock ausgeführt, wenn ein Thread LockDevice aufruft und dann auf einen anderen Thread wartet, der LockDevice aufruft. Es wird auch ein Deadlock ausgeführt, wenn ein Thread LockDevice zweimal aufruft , ohne dass UnlockDevice dazwischen aufgerufen wird.

Beispiele

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

Anforderungen

   
Unterstützte Mindestversion (Client) Windows Vista [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile dxva2api.h

Weitere Informationen

Direct3D-Geräte-Manager

IDirect3DDeviceManager9