Problem beim Initialisieren von DirectDraw



  • Hallo ich fange gerade mit dem Buch "Tricks of the Windows Game Programming Gurus" an.
    Nun bin ich soweit, dass ich DirectDraw initialisieren kann. Allerdings bekomme ich, sobald ich meine Anwendung kompilieren will, vom Linker einen Fehler angezeigt, der heißt:

    Linker-Vorgang läuft...
    game.obj : error LNK2001: Nichtaufgeloestes externes Symbol _IID_IDirectDraw7
    Debug/DirectX.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    Ich habe das ganze so aufgebaut, dass ich eine main.cpp habe, die die globalen Variablen (ich weiß, dass es scheiße ist aber ich fang erst an) sowie die WinMain und die WinProc enthält. In der WinMain werden auch die Initialisierungs- und Shutdownfunktionen aufgerufen, die ich in extra Dateien untergebracht habe. Das ganze läuft auch soweit, es wird ein Fenster angezeigt und so weiter.
    Jetzt habe ich in der main.cpp mein LPDIRECTDRAW7 Objekt deklariert und in den game Dateien habe ich mit extern einen Verweis darauf gemacht, um in der Initialisierungsfunktion auf das Objekt zugreifen zu können.
    Den Code habe ich aus den Sources des Buchs kopiert, am initialisieren kann es eigentlich nicht liegen. Genauso wenig am Release am Schluss. Auch den Code habe ich erstmal aus dem Buch kopiert (um sicher zugehen dass ich nicht was falsches getippt habe).
    Könnte es daran liegen, dass ich mein Visual C++ nicht richtig eingestellt habe? Den Searchpath zu den libs sowie zu den Headern habe ich angegeben. Die ddraw.lib habe ich ins Projekt eingefügt und die ddraw.h in den Headern inkludiert. Und ich habe in den Linkereinstellungen unter Objekt-/Bibliothek-Module die ddraw.lib angegeben.
    Mehr wichtige Einstellungen hab ich im Netz nicht gefunden und auch das Buch gibt mir nicht mehr Ratschläge.
    Habt ihr nen Rat woran es liegen könnte?
    Hier der wichtige Teil vom Code:

    //main.cpp
    LPDIRECTDRAW7 lpdd7 = NULL;
    
    int WINAPI WinMain(	HINSTANCE hinstance,
    					HINSTANCE hprevinstance,
    					LPSTR lpcmdline,
    					int ncmdshow)
    {
    
    WNDCLASSEX winclass; // this will hold the class we create
    HWND	   hwnd;	 // generic window handle
    MSG		   msg;		 // generic message
    HDC        hdc;      // graphics device context
    
    [...]
    //Window erstellt
    [...]
    
    // save main window handle
    main_window_handle = hwnd;
    
    // initialize game here
    Game_Init();
    
    // enter main event loop
    while(TRUE)
    	{
        // test if there is a message in queue, if so get it
    	if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    	   { 
    	   // test if this is a quit
           if (msg.message == WM_QUIT)
               break;
    
    	   // translate any accelerator keys
    	   TranslateMessage(&msg);
    
    	   // send the message to the window proc
    	   DispatchMessage(&msg);
    	   } // end if
    
           // main game processing goes here
           Game_Main();
    
    	} // end while
    
    // closedown game here
    Game_Shutdown();
    
    // return to Windows like this
    return(msg.wParam);
    
    } // end WinMain
    
    ////////////////////////////////////////////////////////////////////
    // game.h
    #ifndef GAME_H
    #define GAME_H
    
    #include <windows.h>
    #include <ddraw.h>
    
    // MACROS /////////////////////////////////////////////////
    inline BOOL KeyDown(int vk_code) 
    	{ return (GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0; }
    
    inline BOOL KeyUp(int vk_code)   
    	{ return (GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1;}
    
    // Prototypen /////////////////////////////////////////////
    int Game_Main(void *parms = NULL, int num_parms =0);
    int Game_Init(void *parms = NULL, int num_parms =0);
    int Game_Shutdown(void *parms = NULL, int num_parms =0);
    
    // Externe globale ////////////////////////////////////////
    extern HWND main_window_handle;
    extern HINSTANCE  hinstance_app;
    extern LPDIRECTDRAW7 lpdd7;                        //<-- !!!!!
    
    #endif
    
    ////////////////////////////////////////////////////////////////////
    //game.cpp
    //includes
    #include "game.h"
    
    // Functions
    
    int Game_Main(void *parms, int num_parms)
    {
    // this is the main loop of the game, do all your processing
    // here
    
    // for now test if user is hitting ESC and send WM_CLOSE
    if (KeyDown(VK_ESCAPE))
       SendMessage(main_window_handle,WM_CLOSE,0,0);
    
    // return success or failure or your own return code here
    return(1);
    
    } // end Game_Main
    ////////////////////////////////////////////////////////////
    
    int Game_Init(void *parms, int num_parms)  //<-- !!!!!!!!!!!!
    {
    // this is called once after the initial window is created and
    // before the main event loop is entered, do all your initialization
    // here
    // create IDirectDraw interface 7.0 object and test for error
    if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd7, IID_IDirectDraw7, NULL)))
       return(0);
    
    // set cooperation to normal since this will be a windowed app
    lpdd7->SetCooperativeLevel(main_window_handle, DDSCL_NORMAL);
    
    // return success or failure or your own return code here
    return(1);
    
    } // end Game_Init
    /////////////////////////////////////////////////////////////
    
    int Game_Shutdown(void *parms, int num_parms) //<--!!!!!!!!!
    {
    // this is called after the game is exited and the main event
    // loop while is exited, do all you cleanup and shutdown here
    if (lpdd7)
       {
       lpdd7->Release();
       lpdd7 = NULL;
       } // end if
    // return success or failure or your own return code here
    return(1);
    
    } // end Game_Shutdown
    

    Ich hoffe ihr könnt mir helfen... Ich weiß echt nicht mehr weiter, da ich eigentlich alles so gemacht habe wie es im Buch steht oder im Netz beschrieben wird.
    Danke!!!



  • Hab es gelöst. Hatte die dxguid.lib nicht ins Projekt eingebunden...


Anmelden zum Antworten