[Linker error] undefined reference to ... Irgendwas streikt bei WinMain

Nord-Süd-Richtung

Erfahrenes Mitglied
Wunderschönen guten Abend Com!

Ich versuche mcih an der Windowsprogrammierung mit C (ich weiß, Linux usw ist viel besser, aber bitte lasst mal Kommentare in die Richtung :) ), aber Dev-C++ spuckt mir 2 Fehlermeldungen aus.
Ich habe keine Ahung wo der Fehler liegt, ich habe es 1:1 aus dem Buch (WindowsProgrammierung) übernommen.
Ich poste einfach mal den ganzen Code, da ich denke, das euch die 2 Zeilen nicht weiterhelfen werden :D
C++:
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("HelloWin");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
    
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); //Einmal hier
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;
    
    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL,TEXT("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),szAppName, MB_OK|MB_ICONERROR);
        return 0;
        }
    hwnd = CreateWindow(
    szAppName,
    TEXT("Das erste echte Programm"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,
    NULL,
    hInstance,
    NULL
    );
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
    while (GetMessage(&msg, NULL,0,0))
    {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
          return msg.wParam;
    }
}
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
            HDC hdc;
            PAINTSTRUCT ps;
            RECT rect;
            switch (message)
            {
                   case WM_CREATE:
                        PlaySound("D:\Eigene Musik/Spit it out",NULL,SND_FILENAME|SND_ASYNC); //Einmal da
                        return 0;
                   case WM_PAINT:
                        hdc = BeginPaint (hwnd,&ps);
                        GetClientRect(hwnd,&rect);
                        DrawText (hdc, TEXT("Hello, Window XP!"), -1, &rect, DT_SINGLELINE | DT_VCENTER);
                        EndPaint(hwnd, &ps);
                        return 0;
                   case WM_DESTROY:
                        PostQuitMessage(0);
                        return 0;
            }
    return DefWindowProc(hwnd, message, wParam, lParam);
    }
:confused:
 
Hi,

Mist, hab ich wohl vergessen zu posten :D
Das war einmal zu GetStockObject und PlaySound (siehe Source).

Ich habe das Problem inzwischen zu 50% gelöst.
Ich hatte shlicht und einfach veregssen das ganze in eine Windows Application zu speichern :-[
Damit ging der GetStockObject Fehler schon mal weg. Das Playsound habe ich einfach herausgenommen.
Mein Problem jetzt: Das Fenster schließt sich unmittelbar nach der initialisierung -.-
Es wird auch nur eine *.o Datei gespeichert, aber keine *.exe...
C++:
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("HelloWin");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
    
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;
    
    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL,TEXT("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),szAppName, MB_OK|MB_ICONERROR);
        return 0;
        }
    hwnd = CreateWindow(
    szAppName,
    TEXT("Das erste echte Programm"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,
    NULL,
    hInstance,
    NULL
    );
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
    while (GetMessage(&msg, NULL,0,0))
    {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
          return msg.wParam;
    }
}
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
            HDC hdc;
            PAINTSTRUCT ps;
            RECT rect;
            switch (message)
            {
                   case WM_DESTROY:
                         PostQuitMessage (0);     
                         break;
                   default:
                         return DefWindowProc(hwnd, message, wParam, lParam);                           
            }
    return 0;
    }
Das Ganze wird ohne Fehlermeldung/Warnung etc kompiliert, es öffnet sich lediglich und schließt sich nach einem Sekundenbruchteil :(
 
Es wird auch nur eine *.o Datei gespeichert, aber keine *.exe...
Sehr unwahrscheinlich, denn dann würde das Programm auch nicht kurz aufblitzen. Die EXE liegt wahrscheinlich in einem anderen Verzeichnis (ich kenne mich mit Dev C++ nicht aus).

Was deinen Code betrifft: Du springst ja aus der Message-Loop gleich wieder heraus. Damit ist das Programm natürlich gleich beendet.
Das sollte eher so aussehen:
C++:
...

int nRet;   
MSG msg; 

while( (nRet = GetMessage(&msg, NULL, 0, 0)) != 0 )
{ 
    if( nRet == (-1) )
    {
        break;
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
} 

return 0;
Gruß
MCoder
 
bis auf die *.exe funktioniert jetzt alles =)
Das ist schwer vorstellbar. Ohne .exe sollte gar nichts laufen. Da musst du vielleicht noch mal suchen :)

Kannst du vllt noch erklären, was der Teil macht?
Das gibt's eigentlich nicht viel zu erklären. Das ist eine Endlosschleife, die die Windows-Messages für deine Applikation einsammelt (GetMessage) und an die Callback-Funktion weiterreicht (TranslateMessage, DispatchMessage).

Gruß
MCoder
 
Zurück