DDraw - CreateSurface liefert NOEXCLUSIVEMODE



  • Das Problem beschäftigt mich jetzt seit zwei Tagen und ich werde daraus nicht schlau. Ich erstelle einen DDraw-Context mit DirectDrawCreate, setze den CooperativeLevel auf DDSCL_NORMAL | DDSCL_NOWINDOWCHANGES und rufe CreateSurface auf:

    DDSURFACEDESC ddsd;
    ZeroMemory(&ddsd, sizeof(ddsd));
    
    HRESULT whatever = ddraw->SetCooperativeLevel(hwndSender, DDSCL_NORMAL | DDSCL_NOWINDOWCHANGES);
    if(SUCCEEDED(whatever))
    {
    	ddsd.dwSize = sizeof(ddsd);
    	ddsd.dwFlags = DDSD_CAPS;
    	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
    
    	logOutput << "create surface" << endl;
    	IDirectDrawSurface *surface;
    	whatever = ddraw->CreateSurface(&ddsd, &surface, NULL);
            ...
    }
    

    aber CreateSurface liefert mir jedesmal den Fehler DDERR_NOEXCLUSIVEMODE (den laut MSDN eigentlich nur IDirectDraw7 liefern darf). Ich verstehe nicht ganz, wieso DirectDraw in diesem Kontext alleinigen Zugriff auf die Grafikhardware fordert. Jemand eine Ahnung was da los ist?



  • Okay ich hab's selbst rausgefunden. Der Fehler trat auf, da bereits eine andere Anwendung im Exclusive Mode lief - eigentlich recht logisch, dass das dann rumbockt, nur die Fehlermeldung war wie bei M$ üblich wenig hilfreich.



  • Wieso genau musst du eigentlich DirectDraw verwenden!? So alt wie das ist, sollte man es doch schon fast als Wunder betrachten, dass es überhaupt noch funktioniert...



  • Es geht um Videocapturing mit OBS. Ich arbeite im Moment an einem DirectDraw-Capture Plugin, die Source findet sich unter https://github.com/Bl00drav3n/OBS. Gibt leider noch ein paar Probleme, im Moment teste ich mit dem Spiel "Desperados: Wanted Dead or Alive", krieg aber nur Videoframeraten von ungefähr 5 FPS bei 1024x768 zusammen (client memory capture). Falls irgendjemand ne Ahnung hat, wie man eine DirectDrawSurface auf eine D3D-Textur blitten kann, der möge mir bitte bescheid sagen. ^^'

    Die einzigen anderen Optionen wären einen DirectX oder OpenGL Wrapper für DirectDraw zu schreiben und diesen für's Rendering der Spiele zu verwenden (wie es zB Wine macht), oder das Spiel in den Windowmode zwingen. Ersteres dürfte aber um Welten schwieriger werden, noch dazu weil das alte DirectDraw oft mit GDI kombiniert wurde. Die zweite Möglichkeit scheint auch keine gute Lösung zu sein, da DirectDraw Spiele so gut wie immer im Exclusive-Mode laufen wollen und dementsprechendes Chaos am System anrichten, wenn man sie in den Windowed-Mode zwingt.

    Edit: Hier ein Testvideo.


Anmelden zum Antworten