Bug beim erstellen eines einfachen Programms



  • Hi

    Ich hab folgendes Problem.
    Ich vor kurzen Angefangen C++ zu lernen und habe mir dazu ein Buch geschnappt,welches schon länger in meinem Regal liegt.
    Jetzt bin ich grade beim Kapitel,wo ich die Windows Grundlagen lerne und habe dieses Programm,welches im Buch steht abgeschrieben,um die Möglichkeiten zu testen,was ich alles ändern kann wenn ich die ein oder andere Variable ändere.
    Wenn ich das Programm mit Hilfe des im Buch beigelegten Editors ausführen will,dann kommt immer die Fehlermeldung

    **"--------------------Konfiguration: HelloWindows - Win32 Debug--------------------
    Linker-Vorgang läuft...
    LIBCD.lib(crt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _main
    Debug/HelloWindows.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    HelloWindows.exe - 2 Fehler, 0 Warnung(en)"**

    und es wird keine .exe Datei erstellt.
    Erst dachte ich,dass ich mich irgendwo vertippt habe,aber dann habe ich die Beispiele von der CD installiert habe,wo praktisch alle Programme drin sind,die im Buch behandelt werden.
    Als ich dann dieses Programm geöffnet habe,dann sah ich,dass bei den Beispielen die gleiche Fehlermeldung kam.
    Ich vermute,dass irgendwelche Headerdateien durch ein Windowsupdate veraltet sind und darum nicht mehr richtig funktionieren.
    Meine Frage ist jetzt ob es eine Möglichkeit gibt dieses Problem zu lösen.

    Es soll ein Programm sein,welches ein weißes Fenster öffnet.
    Hier ist der Quelltext:

    #include <windows.h>
    HWND CreateMainWindow(HINSTANCE hInstance);
    LRESULT CALLBACK MessageHandler(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
    HWND hWnd = 0;
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    {
    hWnd = CreateMainWindow(hInstance);
    if(0 == hWnd)
    {
    MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
    return 0;
    }
    MSG msg;
    while(GetMessage(&msg,0,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return 0;
    }
    LRESULT CALLBACK MessageHandler(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
    switch(msg)
    {
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    break;
    }
    return (DefWindowProc(hwnd,msg,wParam,lParam));
    }
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
    WNDCLASSEX wndClass;
    wndClass.cbSize = sizeof(WNDCLASSEX);
    wndClass.style = CS_DBLCLKS | CS_OWNDC |
    CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = MessageHandler;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hInstance = hInstance;
    wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    //Hier gibt er auch hin und wieder ne Fehlermeldung aus wo ich nie verstanden habe,was er wollte.**
    wndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
    wndClass.lpszMenuName = 0;
    wndClass.lpszClassName = "WindowClass";
    wndClass.hIcon = LoadIcon(NULL,IDI_WINLOGO);
    wndClass.hIconSm = LoadIcon(NULL,IDI_WINLOGO);
    RegisterClassEx(&wndClass);
    return CreateWindowEx(0,"WindowClass","Ein einfaches Fenster",WS_OVERLAPPEDWINDOW | WS_VISIBLE,0,0,400,300,0,0,hInstance,0);
    }**



  • Hast du auch wirklich ein Win32-Projekt im VS gemacht und keine Konsolenanwendung?



  • Auf Grund deiner Spikulation habe ich ein neues Projekt angelegt mit dem Namen "Versuch".
    Dort habe ich "Win32 Anwendung" ausgewählt und habe dann den gesamten Code reinkopiert und durch den Compiler laufen lassen.
    Der Compiler hat dieses mal tatsächlich 0 Fehlermeldungen gegeben und das Programm funktioniert.
    Das Komische ist jetzt,dass bei dem Porgramm "HelloWindows",wie ich es vorher genannt habe und bei den ganzen Beispielprogrammen auf der CD made by Christian Rousselle immernoch die Fehlermeldung

    **"--------------------Konfiguration: HelloWindows - Win32 Debug--------------------
    Linker-Vorgang läuft...
    LIBCD.lib(crt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _main
    Debug/HelloWindows.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    HelloWindows.exe - 2 Fehler, 0 Warnung(en)"**

    kommt.
    Wundert mich,da sich nur der Name des Programms geändert hat und ich glaub dass mindestens bei den Beispielen von der CD wird man sicher eine Win32 Anwendung und keine Konsolenanwendung ausgewählt haben.
    Ich werd da irgendwie nicht schlau draus aber vielen Dank Pellaeon. 🙂

    Edit:Ich habe jetzt 2 Werte in der CreateMainWindow Funktion geändert.
    Undzwar wollte ich die Größe des erstellten Fensters von 400x300 in 1000x800 ändern.
    Jetzt ist es so,dass auch in diesem Programm diese Fehlermeldungen kommen.



  • Öffne mal dein Projekt im Visual Studio. Dann gehe in den Projektmappenexlporer. Dort machst du nen Rechtsklick auf den Projektnamen und gehst im Kontextnmenu auf Eigenschaften. Jetzt bist du in den aktuellen Projekteigenschaften.

    Klappe den Baum bei Linker auf. Dor gehst du auf den Punkt System.
    Dort dann der erste Punkt Subsystem. Wenn du ne Windowsanwendung willst, muss da auch Windows ausgewählt sein.. Schau mal das der da nicht auf Konsole steht.



  • Ich habe jetzt in den Projekteigenschaften rumgewühlt und habe keine Option gefunden,wo man so etwas einstellen konnte.
    Dieses Problem scheint auch erst im Laufe der Zeit sich zu "entwickeln".
    Nachdem ich ein neues Projekt erstellt habe ging es einige Zeit gut,doch auf einmal geht es wieder los.
    Womöglich hat das was mit dem Compiler zu tun.
    Der hat Fehler in meinem Programm entdeckt wie Tippfehler etc.
    Als ich sie dann behoben habe kam der Bug.
    Als der Compiler noch keine Tippfehler oÄ entdeckt hatte,lief das Programm wunderbar.



  • Hallo, ist zwar für den MSVC6 geschrieben, trifft aber Dein Problem genau:
    http://www.henkessoft.de/C++/WinAPI/WinAPI Kapitel 1 bis 6/api1.htm

    In den Linkereinstellungen muss Folgendes geändert werden:
    /subsystem:console ==> /subsystem:windows

    Konsolen-Programm         Windows-Programm
    Auswahl beim Anwendungs-Assistent   Win32-Konsolenanwendung   Win32-Anwendung
    Einsprung-Funktion im Sourcecode    main(...)                 WinMain(...)
    Linker-Einstellung                  /subsystem:console       /subsystem:windows
    


  • Ich danke euch beiden.
    Jetzt habe ich die Stelle gefunden,wo man Subsystem ändern kann und das Problem ist entgültig gelöst. 🙂
    Topic kann jetzt geclosed werden.


Anmelden zum Antworten