BloodShed Dev-C++ 5: DirectDraw Problem



  • Hallo Leute! Die vermeindliche Lösung auf folgendes Problem habe ich bereits gefunden, sie hat mein Problem aber leider nicht gelöst!

    Es geht um folgende Fehlernachricht(en):

    [Linker error] undefined reference to IID_IDirectDraw7' [Linker error] undefined reference toDirectDrawCreateEx@16'

    Was im MS Visual Studio wohl so ähnlich aussehen dürfte:

    nicht aufgelöstes externes Symbol 'IID_IDirectDraw7'
    ...

    Dieses Problem scheinen ja öfter irgendwelche Noobs zu haben.
    Nur leider bin ich keiner, DirectDraw habe ich schon vor Jahren gelernt
    und beschäftige mich heute mehr mit der 3D-Spieleprogrammierung mit OpenGL
    aber auch DirectX9. Jedenfalls wollte ich nun von MS Visual Studio 6 auf Bloodshed
    Dev-C++ umsteigen und hab mir prompt die 5. Version (beta) runtergeladen.
    Nun wollte ich mal zum Testen ein simples DirectDraw-Programm darauf ausführen: "Hello World". Wobei der Schriftzug einfach per GDI-Funktionen auf das Surface geschrieben wird. Alles kein Problem. Nun zum Fehler,
    ich habe auch schon im Voraus die Libs "ddraw.lib" und "dxguid.lib" wie folgt eingebunden:

    #pragma comment(lib, "ddraw.lib")
    #pragma comment(lib, "dxguid.lib")

    Und das vor jeglichen Funktionen/Klassen welche DirectDraw-Funktionen nutzen.
    Trotzdem taucht der oben genannte Linker-Fehler auf. Ich kann mir absolut nicht erklären warum!? Ich habe auch alle nötige Verzeichnisse für Bloodshed Dev eingestellt, also das jeweilige LIB- und INCLUDE-Verzeichnis des DirectX SDKs usw.

    Weiß jemand worans liegen könnte? Vielleicht habe ich auch einen Fehler gemacht, weil es einfach zu lange her ist, dass ich mit DirectDraw gearbeitet habe...

    Hier jedenfalls der Code:

    #pragma comment(lib, "ddraw.lib")
    #pragma comment(lib, "dxguid.lib")
    
    #include <windows.h>
    #include <ddraw.h>
    
    HWND		hWnd;
    HINSTANCE	hInstance;
    bool		Done = false;
    bool		Keys[256];		// stores keyboard input
    
    LPDIRECTDRAW7 lpDD7=NULL;
    LPDIRECTDRAWSURFACE7 lpDDSPrimary=NULL;
    
    // === globale Funktionen ===
    
    int				GameInit();
    void			GameExit();
    void			GameMain();
    void 			DirectDrawShutdown();
    int 			DirectDrawInit(int ScrWidth,int ScrHeight,int ScrBpp);
    
    void			ProceedKeys(); // reset keys
    
    // === Hauptfunktionen ===
    
    LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
    {
    	switch(message)
    	{
    	case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    			return 0;
    		} break;
    	case WM_KEYDOWN:
    		{
    			Keys[wparam] = true;
    		} break;
    	case WM_KEYUP:
    		{
    			Keys[wparam] = false;
    		} break;
    	default:break;
    	}
    
    	return (DefWindowProc(hwnd,message,wparam,lparam));
    }
    
    int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst,LPSTR lpcmdline,int ncmdshow)
    {
    	WNDCLASSEX				wc;
    	MSG						message;
    	const char				szclassname[] = "Hello World";
    
    	wc.cbSize				= sizeof(WNDCLASSEX);
    	wc.style				= CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc			= WndProc;
    	wc.cbClsExtra			= 0;
    	wc.cbWndExtra			= 0;
    	wc.hInstance			= hinst;
    	wc.hIcon				= LoadIcon(NULL,IDI_APPLICATION);
    	wc.hCursor				= LoadCursor(NULL,IDC_ARROW);
    	wc.hbrBackground		= (HBRUSH)GetStockObject(BLACK_BRUSH);
    	wc.lpszMenuName			= NULL;
    	wc.lpszClassName		= szclassname;
    	wc.hIconSm				= LoadIcon(NULL,IDI_APPLICATION);
    
    	if(!RegisterClassEx(&wc))
    	{
    		return 0;
    	}
    
    	int smwidth = GetSystemMetrics(SM_CXSCREEN);
    	int smheight = GetSystemMetrics(SM_CYSCREEN);
    
    	int nx = smwidth/2-(((smwidth/100)*40)/2);
    	int ny = smheight/2-(((smheight/100)*40)/2);
    	int nwidth = ((smwidth/100)*40);
    	int nheight = ((smheight/100)*40);
    
    	if(!(hWnd = CreateWindowEx(NULL,
    		szclassname,
    		"Hello World!",
    		WS_POPUPWINDOW | WS_VISIBLE,
    		nx,ny,
    		nwidth,nheight,
    		NULL,
    		NULL,
    		hinst,
    		NULL)))
    	{
    		return 0;
    	}
    
    	ShowWindow(hWnd,ncmdshow);
    	UpdateWindow(hWnd);
    
    	ShowCursor(FALSE);
    
    	if(GameInit() < 0) return -1;
    
    	while(!Done)
    	{
    		// proceed messages
    		if(PeekMessage(&message,NULL,0,0,PM_REMOVE))
    		{
    			if(message.message == WM_QUIT) Done = true;
    
    			TranslateMessage(&message);
    			DispatchMessage(&message);
    		}
    
    		GameMain();
    
    		// check if user wants to exit
    		if(Keys[VK_ESCAPE]) 
    		{
    			PostQuitMessage(0);
    		}
    	}
    
    	ShowCursor(TRUE);
    
    	// exit game
    	GameExit();
    
    	return message.wParam;
    }
    
    int GameInit()
    {
    	DirectDrawInit(800,600,32);
    
    	return 1;
    }
    
    void GameMain()
    {
    	// display "Hello World!" on screen
    
    	ProceedKeys();	
    }
    
    void GameExit()
    {
    	DirectDrawShutdown();
    }
    
    void ProceedKeys()
    {
    	for(int j=0;j<255;j++)
    	{
    		Keys[j] = false;
    	}
    }
    
    void DirectDrawShutdown()
    {
    	if(lpDDSPrimary!=NULL) lpDDSPrimary->Release();
    	if(lpDD7!=NULL) lpDD7->Release();
    }
    
    int DirectDrawInit(int ScrWidth,int ScrHeight,int ScrBpp)
    {	
    	if(FAILED(DirectDrawCreateEx(NULL,(LPVOID*)&lpDD7,IID_IDirectDraw7,NULL)))
    	{
    		MessageBox(hWnd,"DirectDrawCreateEx failed","Error",MB_ICONERROR | MB_OK);
    		return -1;
    	}
    
    	if(FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
    	{
    		MessageBox(hWnd,"SetCooperativeLevel failed","Error",MB_ICONERROR | MB_OK);
    		return -1;
    	}
    
    	if(FAILED(lpDD7->SetDisplayMode(ScrWidth,ScrHeight,ScrBpp,0,0)))
    	{
    		MessageBox(hWnd,"SetDisplayMode failed","Error",MB_ICONERROR | MB_OK);
    		return -1;
    	}
    
    	DDSURFACEDESC2 ddsd;
    
    	ZeroMemory(&ddsd,sizeof(ddsd));
    	ddsd.dwSize = sizeof(ddsd);
    
    	ddsd.dwFlags = DDSD_CAPS;
    
    	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
    			             DDSCAPS_VIDEOMEMORY; 
    
    	if(FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL)))
    	{
    		MessageBox(hWnd,"CreateSurface failed","Error",MB_ICONERROR | MB_OK);
    		return -1;
    	}
    	return 0;
    }
    


  • DX Lib und non MS Compiler? Siehe FAQ oder google. 😎

    Bye, TGGC \-/



  • Okay, die Antwort fand sich tatsächlich in den FAQ, und dann auch noch von dir. 🤡

    Danke.


Log in to reply