# Eclipse CDT Win API



## Thiele (21. September 2009)

Hallo,
so mein erster Beitrag - natürlich nicht ganz uneigennütig 

Ich wollte heute anfangen mit C Windowsprogrammierung, hab mir eclipse, mingw gehohlt und alles installiert - ganz toll. 

Nun wollte ich irgendwelche billigen Anwendungen schreiben, die die Win Api nutzen (und nur diese, kein gtk+, qt oder was es da noch gibt). Hab auf Wikipedia ein nettes Codebeispiel gefunden:


```
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
{
   static TCHAR const szAppName[] = TEXT("Klassenname");
   HWND         hWnd;
   MSG          msg;
   WNDCLASSEX   wndclassex;
 
   wndclassex.cbSize        = sizeof (WNDCLASSEX);
   wndclassex.style         = CS_HREDRAW | CS_VREDRAW;
   wndclassex.lpfnWndProc   = &WndProc;
   wndclassex.cbClsExtra    = 0;
   wndclassex.cbWndExtra    = 0;
   wndclassex.hInstance     = hInstance;
   wndclassex.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
   wndclassex.hCursor       = LoadCursor(NULL, IDC_ARROW);
   wndclassex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
   wndclassex.lpszMenuName  = NULL;
   wndclassex.lpszClassName = szAppName;
   wndclassex.hIconSm       = wndclassex.hIcon;
 
   if (!RegisterClassEx(&wndclassex))
   {
      MessageBox(NULL, TEXT("RegisterClassEx fehlgeschlagen!"),
                 szAppName, MB_OK | MB_ICONERROR);
      return -1;
   }
 
   hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, // erweiterter Fensterstil
                  szAppName, // Name der Fensterklasse
                  TEXT("Fenstertitel"), // Fenstertitel
                  WS_OVERLAPPEDWINDOW, // Fensterstil
                  CW_USEDEFAULT, // X-Position des Fensters
                  CW_USEDEFAULT, // Y-Position des Fensters
                  CW_USEDEFAULT, // Fensterbreite
                  CW_USEDEFAULT, // Fensterhöhe
                  NULL, // übergeordnetes Fenster
                  NULL, // Menü
                  hInstance, // Programm-Kopiezähler (Programm-ID)
                  NULL); // zusätzliche Parameter
 
   ShowWindow(hWnd, iCmdShow);
   UpdateWindow(hWnd);
 
   for (;;)
   {
      int ret = GetMessage(&msg, NULL, 0, 0);
      if (ret == -1)
         return -1;
      else if (ret == 0)
         break;
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
 
   UnregisterClass(szAppName, hInstance);
 
   return (int)msg.wParam;
}
 
// Die Hauptnachrichtenschleife 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   HDC hdc;
   PAINTSTRUCT ps;
 
   switch (message)
   {
   case WM_PAINT:
       hdc = BeginPaint(hWnd, &ps);
       TextOut(hdc, 0, 0, TEXT("Hello World!"), 12);
       EndPaint(hWnd, &ps);
       return 0;
 
   case WM_CLOSE:
       DestroyWindow(hWnd);
       break;
 
   case WM_DESTROY:
       PostQuitMessage(0);
       return 0;
   }
 
   return DefWindowProc(hWnd, message, wParam, lParam);
}
```

auch wenn ich 0% davon verstehe hat es unter Visual Studio prima geklappt ^^ unter Eclipse leider nicht.

In dem Code hat der ja keine Main-Funktion sondern nur eine WinMain, ich glaub damit kommt mein MinGW net klar. So sieht mein Buildlog aus:


```
**** Build of configuration Debug for project ConsoleCalculate ****

**** Internal Builder is used for build               ****
gcc -O0 -g3 -Wall -c -fmessage-length=0 -omain.o ..\main.c
gcc -oConsoleCalculate.exe main.o
main.o: In function `WinMain':
E:/eclipse/workspace/ConsoleCalculate/Debug/../main.c:21: undefined reference to `GetStockObject@4'
main.o: In function `WndProc':
E:/eclipse/workspace/ConsoleCalculate/Debug/../main.c:75: undefined reference to `TextOutA@20'
collect2: ld returned 1 exit status
Build error occurred, build is stopped
Time consumed: 434  ms.
```


Was mache ich falsch? Ich glaub, ich muss noch irgendwelche Bibliotheken (.dll ?) irgendwo einbinden, aber ich hab den Abend jetzt im Internet rumgesucht und nichts gefunden. 

Sicher begehe ich irgend ein Anfängerfehler. Bei Visual Studio konnte ich immer so einfach auswählen "Konsolenanwendung" - "Gui Anwendung", geht das bei CDT auch irgendwo?

mfg
Thiele


----------



## deepthroat (22. September 2009)

Hi.

Trag mal in den Projekteinstellungen unter "MinGW C++ Linker"->Miscellaneous -> "Linker flags" ein: -mwindows

Gruß


----------



## Thiele (22. September 2009)

Super ! Hat geklappt.

Was genau hab ich gemacht?


Nebenbei:

Eclipse zeigt mir bei dem Code jede Menge Syntaxfehler an, erst als ich das Fenster maximiert hab gingen diese Weg. Dann zeigte er nurnoch ein Object als Fehlerhaft an - nachdem ich aber den Buildvorgang gestartet hatte hat Eclipse auch diesen Fehler beseitigt.
Irgendwie etwas komisch, wieso markert Eclipse Sache an, die richtig sind?


----------



## deepthroat (22. September 2009)

Thiele hat gesagt.:


> Was genau hab ich gemacht?


Die Option führt dazu, dass

1) das Subsystem des Programmes auf WINDOWS gesetzt wird (kein Konsolenfenster bei der Ausführung).

2) Standardbibliotheken von Windows eingebunden werden (GetStockObject und TextOutA sind z.B. in der gdi32.lib definiert)


Thiele hat gesagt.:


> Nebenbei:
> 
> Eclipse zeigt mir bei dem Code jede Menge Syntaxfehler an, erst als ich das Fenster maximiert hab gingen diese Weg. Dann zeigte er nurnoch ein Object als Fehlerhaft an - nachdem ich aber den Buildvorgang gestartet hatte hat Eclipse auch diesen Fehler beseitigt.
> Irgendwie etwas komisch, wieso markert Eclipse Sache an, die richtig sind?


Keine Ahnung.

Gruß


----------

