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 to
DirectDrawCreateEx@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.