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 ... blablablaWinMain_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); #endifDatei 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); #endifgibt 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 funktioniertnaja 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*