WinAPI in mehreren Dateien



  • Hallo Leute

    ich habe ein komisches Problem mit der WinAPI unter Visual C++ 2008 Express Edition.

    Und zwar wage ich mich zu Zeit an Spieleprogrammierung und habe mir dafür eineBook besorgt ("3D-Spiele mit C++ und DirectX in 21 Tagen")

    naja, ich poste eifnach mal die Teile des Quellcodes vond enen ich denke, dass sie den/die Fehler beinhalten.

    Main Datei:

    #include <windows.h>
    #include "WinMain_1.h"
    #include "GameRoutines.h"
    
    int WINAPI WinMain(HINSTANCE hinstance,
    				   HINSTANCE hprevinstance,
    				   LPSTR lpcmdline,
    				   int ncmdshow)
    {
    	WNDCLASSEX winclass;
    	HWND hwnd;
    	MSG msg;
    	// Fenstereigenschaften festlegen:
    	winclass.cbSize = sizeof(WNDCLASSEX);
    	winclass.style = CS_HREDRAW | CS_VREDRAW;
    	winclass.lpfnWndProc = WindowProc;
    	winclass.cbClsExtra = 0;
    	winclass.cbWndExtra = 0;
    	winclass.hInstance = hinstance;
    	winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    	winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    	winclass.lpszMenuName = NULL;
    	winclass.lpszClassName = WINDOW_CLASS_NAME;
    	winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    
            hinstance_app = hinstance;
    
    	if(!RegisterClassEx(&winclass))
    		return(0);
    
    	InitResolution();
    	hwnd = CreateWindowEx(NULL, 
    						  WINDOW_CLASS_NAME,
    						  "My Game Shell",
    						  WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    						  0, 0,
    						  800, 600, 
    						  NULL, NULL,
    						  hinstance, NULL);
    	if ( !(hwnd) )
    			return(0);
    
    	main_window_handle = hwnd;
    	Game_Init();
    	while(TRUE) // Nachrichtenweiterleitung
    	{
    		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    		{
    			if(msg.message == WM_QUIT)
    				break;
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    		Game_Main();
    	}
    	Game_Shutdown();
    	return(msg.wParam);
    }
    
    LRESULT WindowProc ... blablabla
    

    WinMain_1.h

    #ifndef WinMain_1
    #define WinMain_1
    
    /////////////////////////////////////////////////////////////////
    // Globale Variablen
    /////////////////////////////////////////////////////////////////
    HWND main_window_handle = NULL;
    HINSTANCE hinstance_app = NULL;
    /////////////////////////////////////////////////////////////////
    // Funktions prototypen
    /////////////////////////////////////////////////////////////////
    LRESULT CALLBACK WindowProc(HWND hwnd, 
    							UINT msg, 
    							WPARAM wparam, 
    							LPARAM lparam);
    
    #endif
    

    Datei die auf 'main_window_handle' zugreift:

    #include <windows.h>
    #include "GameRoutines.h"
    
    void Game_Main(void)
    {
    	// Mit ESC kann die Anwendung verlassen werden
    	if(KEYDOWN(VK_ESCAPE))
    		SendMessage(main_window_handle,WM_CLOSE,0,0);
    
    	GameMainRoutine();
    }
    

    natürlich gehört da auch en header datei mit den deklarationen zu und die datei sit noch um einiges grösser, aber da wird nie auf ein handle oder ähnliches zugegriffen...

    so der compiler spuckt folgende fehlermeldungen aus:

    WinMain_1.obj : error LNK2005: "struct HWND__ * main_window_handle" (?main_window_handle@@3PAUHWND__@@A) ist bereits in GameRoutines.obj definiert.
    WinMain_1.obj : error LNK2005: "struct HINSTANCE__ * hinstance_app" (?hinstance_app@@3PAUHINSTANCE__@@A) ist bereits in GameRoutines.obj definiert.
    E:\SchuLe\C++\2008\DirectX\Debug\DirectX.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.

    wo liegt mein fehler???

    mfg Skym0sh0

    PS: entschuldigt alle meine Rechtschreibfehler und werft mir nicht so Worte wie dumemr noob oder so an den Kopf...



  • WinMain_1.obj : error LNK2005: "struct HWND__ * main_window_handle" (?main_window_handle@@3PAUHWND__@@A) ist bereits in GameRoutines.obj definiert.
    WinMain_1.obj : error LNK2005: "struct HINSTANCE__ * hinstance_app" (?hinstance_app@@3PAUHINSTANCE__@@A) ist bereits in GameRoutines.obj definiert.
    E:\SchuLe\C++\2008\DirectX\Debug\DirectX.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.

    Steht eigentlich alles schon da,

    die beiden Handle:

    main_window_handle
    hinstance_app
    
    #ifndef WinMain_1
    #define WinMain_1
    
    /////////////////////////////////////////////////////////////////
    // Globale Variablen
    /////////////////////////////////////////////////////////////////
    HWND mein_main_window_handle = NULL; // so z.B.
    HINSTANCE mein_hinstance_app_handle = NULL; // so z.B.
    /////////////////////////////////////////////////////////////////
    // Funktions prototypen
    /////////////////////////////////////////////////////////////////
    LRESULT CALLBACK WindowProc(HWND hwnd,
                                UINT msg,
                                WPARAM wparam,
                                LPARAM lparam);
    
    #endif
    

    gibt es so schon, wenn du denen also andere Namen gibst, sollte
    es gehen. Musst die Namen dann natürlich überall im Quellcode ändern 😉



  • wo soll es die denn geben???

    in der winmain_1.h steht nur HWND main_window_handle und das andere handle

    und ansonsten wird nur einmal main_window_hande mit (dem standart-)hwnd belegt und hinstance_app mit hinstance...

    und main_window_handle wird einmal an eine funktion übergeben

    das wars, wo soll da etwas doppelt sein???

    aber egal ich versuchs mit anderen namen...



  • nein klappt nicht...



  • so jetzt erstmal eine grundlegende frage

    darf ich variablen überhaupt in headerdateien deklarieren???



  • Ja.

    greetz, Swordfish



  • tolle antwort xDDD

    nein aber hat sich erledigt
    ich musste nur 'extern' in der header datei vor die variablen setzen dann hats funktioniert

    naja danke leute

    kann geclosed werden



  • Stimmt, für mich hängen Headerdateien und Klassen
    irgendwie fest zusammen und da brauchste nunmal
    das extern nicht *g*


Anmelden zum Antworten