Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Nichtaufgeloestes externes symobl

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.08.2005, 11:10 Uhr
~Gast
Gast


Hallo!
Ich hab vor kurzem wieder angefangen C++ zu programmieren (musste einiges Auffrischen, da ich viel vergessen hab). Jedenfalls hab ich ein eine einfache Win32-Anwendung geschrieben (ist ein Beispiel aus einem Buch). Bei der Komplimierung des Programms ist noch alles klar, aber sobald ich das Programm ausführen möchte kommt bei mir folgende Fehlermeldung:

--------------------Konfiguration: MausNachrichten - Win32 Debug
--------------------
Linker-Vorgang läuft...
MausNachrichten und Invalidate.obj : error LNK2001: Nichtaufgeloestes externes Symbol "struct HWND__ * __cdecl CreateMainWindow(struct HINSTANCE__ *)" (?CreateMainWindow@@YAPAUHWND__@@PAUHINSTANCE__@@@Z)
Debug/MausNachrichten und Invalidate.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

MausNachrichten und Invalidate.exe - 2 Fehler, 0 Warnung(en)

Kann mir irgendjemand helfen? Ich hab nämlich keine Ahnung, was ich machen soll. Danke schon mal im Voraus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.08.2005, 11:11 Uhr
Oliver
S2-Pixelgeneral


Das bedeutet, dass du die Funktion CreateMainWindow deklariert, aber nich definiert hast.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.08.2005, 11:36 Uhr
~Gast
Gast


Also gut.
Ich hatte in dem Prototypen CreateMainWindow stehen,
bei der Definition aber CreatemainWindow. Somit wäre der Fehler jetzt behoben.
Jetzt kommt aber ein neuer Fehler beim ausführen des Programms. Ich poste hier mal zur Sicherheit gleich den ganzen Quellcode mit:



C++:
#include <windows.h>

HWND CreateMainWindow(HINSTANCE hinstance);                   //Prototypen der Funktionen
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

HWND hwnd = 0;                        //Fenster-Handle
MSG msg;                //Struktur zum Ablegen der Nachrichten

int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    hwnd = CreateMainWindow(hinstance);  //Aufruf der CreateMainWindoW-                                                  //Funktion und Zuweisung des Rückgabewerts in hWnd
                                        if(hwnd == 0)                            //Bedingung, falls Fenster nicht erzeugt werden konnte
    {
        MessageBox(NULL, "Das Fenster konnte nicht erzeugt werden", "Fehler", MB_OK);
    }

    while(GetMessage(&msg, NULL, NULL, NULL))    //Schleife, die solange läuft, bis
    {                                                               //WM_QUIT empfangen wird
        DispatchMessage(&msg); //Nachricht an Callback-Funktion senden
    }
    return 0;
}

HWND CreateMainWindow(HINSTANCE hinstance)        //Funktionsdefinition von
{
    WNDCLASSEX wndclass = {                        //Werte belegen von wndclass
    sizeof(WNDCLASSEX),
    CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW,
    MessageHandler,
    0,
    0,
    hinstance,
    LoadIcon(hinstance, IDI_WINLOGO),
    LoadCursor(hinstance, IDC_ARROW),
    (HBRUSH)GetStockObject(BLACK_BRUSH),
    NULL,
    "WindowClass",
    LoadIcon(NULL, IDI_WINLOGO)
    };
    
    RegisterClassEx(&wndclass);                    //wndclass Windows bekannt machen
    //Fenster erzeugen
    return CreateWindowEx(NULL, "MausNachrichten", "Maus-Fenster", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 300, 400, NULL, NULL, hinstance, NULL);
}

LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) //Die Callback-Funktion
{                                                                    //zum behandeln von Nachrichten                
    HDC hDC;
    switch(msg)                        //Überprüfen, welche Nachricht vorliegt und entsprechend behandeln
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        break;
        
        case WM_LBUTTONDOWN:
            int x1, x2, y1, y2;
            
            hDC = GetDC(hwnd);
            
            x1 = LOWORD(lParam);            //Erfassen der Koordinaten des Zeigers
            y1 = HIWORD(wParam);
            x2 = x1 + 100;
            y2 = y1 + 100;

            Rectangle(hDC, x1, y1, x2, y2);    //Rechteck mit den Werten x1,y1,x2,y2 zeichnen

            ReleaseDC(hwnd, hDC);            //Device Context wieder freigeben

            return 0;
        break;

    }
    return DefWindowProc(hwnd, msg, wParam, lParam);        //Standard-Funktion zum behandeln der
}                                                            //Nachrichten



Jetzt kommt beim Ausführen folgende Fehlermeldung:
--------------------Konfiguration: MausNachrichten und Invalidate - Win32 Debug--------------------
Kompilierung läuft...
MausNachrichten und Invalidate.cpp
Linker-Vorgang läuft...
LINK : fatal error LNK1168: "Debug/MausNachrichten und Invalidate.exe" kann nicht zum Schreiben geoeffnet werden
Fehler beim Ausführen von link.exe.

MausNachrichten und Invalidate.exe - 1 Fehler, 0 Warnung(en)

Könnte mir da vielleicht wieder einer helfen? Wiedermal Danke im Voraus!

Dieser Post wurde am 10.08.2005 um 13:01 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.08.2005, 11:57 Uhr
Tommix



Hallo,

Zitat:

"Debug/MausNachrichten und Invalidate.exe" kann nicht zum Schreiben geoeffnet werden


Meistens heißt das, daß das Programm noch läuft (evtl. abgestürzt). Sieh mal in die Task-Liste. Kann auch sein, daß es ein Problem mit den Leerzeichen im Dateinamen gibt - ich dachte eigentlich, solche Projektnamen nimmt die IDE gar nicht an.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.08.2005, 13:41 Uhr
~Gast
Gast


Also ich jetzt mal deinen Rat befolgt. Leider konnte ich in der Task-Liste nichts feststellen und die Leerzeichen hab ich nun auch weggelassen, auch ohne Erfolg. Der Fehler


C++:
"Debug/MausNachrichten.exe" kann nicht zum Schreiben geoeffnet werden



Aber es ist noch was passiert. Als ich die Dateinamen-Änderung vornahm konnte ich das Programm zwar ausführen, es kam jedoch die die Fehlermeldung "Das Fenster konnte nicht erzeugt werden" (siehe oben bei meinem Quellcode bei der If-Bedingung). Dann als ich das Programm später versucht hab wieder auszuführen kam wieder der Fehler, dass die exe nicht zum Schreiben geöffnet werden kann.
Ich bin vollkommen ratlos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.08.2005, 13:54 Uhr
Tommix



Also ich hab von der API nicht so furchtbar viel Ahnung (dafür haben wir hier auch ein extra Forum) aber wenn die Erzeugung des Fensters fehlgeschlagen ist, solltest Du das Programm beenden:

C++:
    if(hwnd == 0)        //Bedingung, falls Fenster nicht erzeugt werden konnte
    {
        MessageBox(NULL, "Das Fenster konnte nicht erzeugt werden", "Fehler", MB_OK);
        return 1;
    }


Sonst bleibt es offen und kann deswegen vom Linker nicht überschrieben werden.

- Tommix


Bearbeitung:

In der Taskliste ist es vermutlich nicht drin, weil kein Fenster existiert.


Dieser Post wurde am 10.08.2005 um 13:56 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.08.2005, 16:37 Uhr
CplusplusProgrammierer



OK.
Ich hab jetzt das Programm entsprechend überarbeitet. Jetzt kann ich es auch Ausführen ohne das ein Linkfehler vorkommt. Jetzt kommt aber das Beste: Das Fenster kann nicht erzeugt werden (siehe If-Bedingung, Fehlermeldung).
Meine Frage: Welche Gründe gibt es, damit das Fenster nicht erzeugt werden kann und wie kann ich dagegen vorgehen?
Wiedermal Danke im Voraus!

P.S.: Hab mich jetzt mal im Forum angemeldet

Edit: Ok, Alles klar! Ich hab den Fehler gefunden. Ich hab bei CreateWindowEx den falschen Klassenname übergeben. Jetzt funktioniert alles so, wie ich es wollte. Nochmals Danke!

Dieser Post wurde am 10.08.2005 um 16:51 Uhr von CplusplusProgrammierer editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: