Direct Draw 7 auf Win 8



  • Hallo,
    Ich habe ein Problem bei der Portierung einer alten Direct Draw Anwendung von Win XP Embedded auf Win 8 Embedded 32Bit.

    Auf Win XP lief alles einwandfrei.

    Jetzt kann ich die Auflösung nicht mehr Ändern und kein Fenster im Vollbildmodus mehr erstellen.

    Fenstermodus klappt.

    Die Methode GetAttachedSurface schlägt fehl mit dem Error DDERR_NOTFOUND. (Z.124)

    Der Code sieht wie folgt aus:

    DdError
    DirectDraw::CreateFullScreenDisplay (void)
    {
        DdError error = NO_DDERRORS;
    
    	if (msObjectCounter == 0)
    		SetWindowPos (mHwnd, NULL, 0, 0, 10, 10, SWP_NOZORDER); 
    
    	DisplayEnumInfo enum_info;
    	ZeroMemory (&enum_info, sizeof (enum_info));
    	enum_info.mDisplayCounter	= -2;
    	enum_info.mDisplayNr		= mDisplayNr;
    
    	DirectDrawEnumerateEx (DDEnumCallbackEx, &enum_info, DDENUM_ATTACHEDSECONDARYDEVICES);
    
    	GUID *p_guid;
    	GUID guid_null;
        ZeroMemory (&guid_null, sizeof (GUID));
    
    	if (enum_info.mDdGUID == guid_null)
    	{	
    		if (mDisplayNr < 0)
    			p_guid = NULL;
    		else
    			error = ER_DD_INVALIDDISPLAYNR;
    	}
    	else
    		p_guid = &enum_info.mDdGUID;
    
    	if (!error)
    	{
    		if (SUCCEEDED (DirectDrawCreateEx (p_guid, (VOID**) &mpDd, IID_IDirectDraw7, NULL)))
    		{
    			if (!mRefreshRate || !mHeight || !mWidth || !mBpp)
    			{
    				DDSURFACEDESC2 ddsd;
    
    				ddsd.dwSize = sizeof (ddsd);
    
    				if (SUCCEEDED (mpDd->GetDisplayMode (&ddsd)))
    				{
    					if (!mRefreshRate && (ddsd.dwFlags & DDSD_REFRESHRATE))
    						mRefreshRate = ddsd.dwRefreshRate;
    
    					if ((!mHeight || !mWidth) && ((ddsd.dwFlags & DDSD_HEIGHT) && (ddsd.dwFlags & DDSD_WIDTH)))
    					{
    						mHeight = ddsd.dwHeight;
    						mWidth	= ddsd.dwWidth;
    					}
    
    					if (!mBpp && (ddsd.dwFlags & DDSD_PIXELFORMAT))
    						mBpp = ddsd.ddpfPixelFormat.dwRGBBitCount;
    				}
    			}
    
    			if (msObjectCounter == 0)
    			{
    				DWORD style;
    				RECT rect;
    
    				style  = GetWindowStyle (mHwnd);
    				style &= ~WS_OVERLAPPEDWINDOW;
    				style |= WS_POPUP;
    
    				SetWindowLong (mHwnd, GWL_STYLE, style);
    				style = GetWindowStyle (mHwnd);				
    
    				SetRect (&rect, 0, 0, mWidth, mHeight);
    
    				AdjustWindowRectEx (&rect, style, GetMenu (mHwnd) != NULL, GetWindowExStyle (mHwnd));
    				SetWindowPos (mHwnd, NULL, 0, 0, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);
    
    				SetWindowPos (mHwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    			}
    
    			// Set cooperative level
    
    			DWORD level_flags = DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN;
    
    			if (enum_info.mDisplayNr >= 0)
    			{
    				if (msObjectCounter == 0)
    				{
    					if (FAILED (mpDd->SetCooperativeLevel (mHwnd, DDSCL_SETFOCUSWINDOW)))
    						error = ER_DD_SETCLEVELFAILED;
    				}
    				else
    					level_flags |= DDSCL_SETFOCUSWINDOW | DDSCL_CREATEDEVICEWINDOW;
    			}
    
    			if (!error)
    			{
    				if (SUCCEEDED (mpDd->SetCooperativeLevel (mHwnd, level_flags)))
    				{	
    					// Set the display mode
    
    					if (SUCCEEDED (mpDd->SetDisplayMode (mWidth, mHeight, mBpp, mRefreshRate, 0)))
    					{	
    						// Create primary surface (with backbuffer attached)
    						DDSURFACEDESC2 ddsd;
    						ZeroMemory (&ddsd, sizeof (ddsd));
    						ddsd.dwSize				= sizeof (ddsd);
    						ddsd.dwFlags			= DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    						ddsd.ddsCaps.dwCaps		= DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_3DDEVICE;
    
    						if (!mDoubleBackBufferFlag)
    							ddsd.dwBackBufferCount = 1;
    						else
    							ddsd.dwBackBufferCount = 2;
    
    						if (SUCCEEDED (mpDd->CreateSurface (&ddsd, &mpDdsFrontBuffer, NULL)))
    						{
    							// Get a pointer to the back buffer
    							DDSCAPS2 ddscaps;
    							ZeroMemory (&ddscaps, sizeof (ddscaps));
    							ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
    
    							if (SUCCEEDED (mpDdsFrontBuffer->GetAttachedSurface (&ddscaps, &mpDdsBackBuffer)))
    							{
    								if (!mBackClipperFlag || !(error = SetClipperToSurface (mpDdsBackBuffer, false)))
    								{						
    									DirectDraw::UpdateBounds (true);
    
    									if (!CreateDirect3d())
    										error = ER_DD_CREATED3DFAILED;
    								}
    							}
    							else
    								error = ER_DD_NOBACKBUFFER;
    						}
    						else
    							error = ER_DD_CREATESURFACEFAILED;
    					}
    					else
    						error = ER_DD_SETDISPLAYMODEFAILED;
    				}
    				else
    					error = ER_DD_SETCLEVELFAILED;
    			}
    		}	
    		else
    			error = ER_DD_DDCREATEFAILED;
    	}
    
    	return (error);
    }
    

    Kann mir irgendjemand helfen?
    Gibt es Kompatibilitätsprobleme von Direct Draw mit win 8?
    Ich habe das Programm schon als Admin gestartet und auch im Kompatibilitätsmodus für WinXP


  • Mod

    claine schrieb:

    Gibt es Kompatibilitätsprobleme von Direct Draw mit win 8?

    wenn du danach kurz gegooglet haettest, wuestest du, dass directdraw auf win8 nicht supported wird. wenn da etwas funzt ist es pures glueck.



  • Ich hab viel gesucht aber nichts gefunden, das sagt, dass es nicht geht.


Anmelden zum Antworten