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 |
---|---|
|
Die Methode wurde erfolgreich ausgeführt. |
|
Das Gerätehandle ist ungültig. |
|
Der Direct3D-Geräte-Manager wurde nicht initialisiert. Der Besitzer des Geräts muss IDirect3DDeviceManager9::ResetDevice aufrufen. |
|
Das Gerät ist gesperrt, und fBlock ist FALSE. |
|
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 |