DarkWinAPI by Darkleo.com

Das "Hallo World!" Programm

Was macht eigentlich ein echtes Windows-Programm aus? Natürlich: Fenster!

Bisher haben Sie Ihr C- oder C++ Programm mit der Funktion main(...) als Einstiegspunkt begonnen.
Das ändert sich bei Windows-Programmen. Hier verwendet man die Einstiegsfunktion WinMain(...).
Zur Verdeutlichung erstellen wir ein "minimales" Beispiel:

#include <windows.h>

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
  MessageBox( NULL, "Hallo World!", "(c) 2002 by www.darkleo.com", MB_OK );
  return 0;
}

Die Header-Datei windows.h ist die Basis für die Windows-Programmierung. Öffnet man diese Header-Datei, dann findet man die eigene Bezeichnung "Master include file for Windows applications". Innerhalb dieser Datei findet man eine lange Liste weiterer eingebundener (includierter) Dateien. Schauen Sie doch einmal selbst hinein. Mit windows.h stellt uns MS VC++ die für Windows-Programme benötigten Daten und Funktionen zur Verfügung.

Infos aus MSDN zu WinMain(...):
int WINAPI WinMain
(
  HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPSTR     lpCmdLine,
  int       nCmdShow
);
hInstance:

Handle to the current instance of the application.
hPrevInstance:
Handle to the previous instance of the application.
For a Win32-based application, this parameter is always NULL.
lpCmdLine:
Pointer to a null-terminated string specifying the command line for the application,
excluding the program name. To retrieve the entire command line, use the GetCommandLine function.
nCmdShow:
Specifies how the window is to be shown.

Wenn Sie WINAPI weglassen, also folgendes schreiben:

#include <windows.h>

int WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
  MessageBox( NULL, "Inhalt", "Überschrift", MB_OK );
  return 0;
}

erhalten Sie z.B. von VC++ die Warnung:'WinMain' : '__stdcall' muss angegeben werden.

Wenn Sie die Datei windef.h öffnen, finden Sie folgende Anweisung:  #define WINAPI  __stdcall

WINAPI ist ein Bezeichner für  __stdcall (Microsoft-spezifischer Aufruf an den Compiler für Win32-API-Funktionen).
Es gibt aber auch z.B. FAR PASCAL, far pascal oder APIENTRY für diesen Zweck.

Sie können also auch folgendes schreiben:

#include <windows.h>

int __stdcall WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
  MessageBox( NULL, "Inhalt", "Überschrift", MB_OK );
  return 0;
}

oder:

#include <windows.h>

int APIENTRY WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
  MessageBox( NULL, "Inhalt", "Überschrift", MB_OK );
  return 0;
}

oder:

#include <windows.h>

int FAR PASCAL WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
  MessageBox( NULL, "Inhalt", "Überschrift", MB_OK );
  return 0;
}

oder:

#include <windows.h>

int far pascal WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
  MessageBox( NULL, "Inhalt", "Überschrift", MB_OK );
  return 0;
}

Diese Vielfalt  macht die Windows-Programmierung bei Anfängern und Puristen so ungeheuer beliebt!
Ich möchte Sie hier nicht verwirren, sondern Ihnen nur typische Varianten aufzeigen,
damit Sie die Scheu vor dieser Vielfalt abbauen. Härten Sie sich von Anfang an dagegen ab.
 

 Nur zum Verständnis, nicht als Vorbild gedacht:
 Sie können eine Menge weglassen. Folgendes 2-Zeilen-Programm läuft z.B. durch den 
 MS-VC++-Compiler:

 #include <windows.h>
 WinMain( HINSTANCE, HINSTANCE, PSTR, int ) {   MessageBox( NULL, "", "", 0 ); }

 Sie erhalten dann z.B. entsprechende Warnungen:
 'WinMain' : '__stdcall' muss angegeben werden
 'WinMain' : Funktion sollte einen Wert zurueckgeben; Ergebnistyp 'void' angenommen

Innerhalb WinMain(...) wird in unserem kleinen Programm ein Fenster ausgegeben.
Die API-Funktion MessageBox(...) kümmert sich hier einfach um alles, vor allem um das Fenster:

int MessageBox
(
    HWND    hWnd,       // handle of owner window
    LPCTSTR lpText,     // address of text in message box
    LPCTSTR lpCaption,  // address of title of message box
    UINT    uType       // style of message box
);

Manche Programmierer wollen fensterlose Windows-Programme erstellen.
Das ist leicht möglich, wenn man z.B. anstelle MessageBox(...) andere "fensterlose" Aktionen einfügt.
Damit Sie verstehen, was damit gemeint ist, hier ein kleines Beispiel:

#include <windows.h> 

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int ) 

  for( int x=0; x<5; x++ ) 
  { 
    MessageBeep(0); 
    for( int y=0; y<100000000; y++ ); 
  } 
  return 0; 
}

Nachfolgend finden Sie noch ein weiteres Beispiel für ein Windows-Programm ohne eigenes Fenster.
Das Programm ruft den PC-Taschen-Rechner (calc.exe) und den Notizblock (notepad.exe) auf.

#include <windows.h> 

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int ) 

  WinExec("calc.exe",    SW_NORMAL);
  WinExec("notepad.exe", SW_NORMAL);
  return 0; 
}

 

  2-Zeiler-Version (nur zum Spaß!): 
#include <windows.h>
WinMain( HINSTANCE, HINSTANCE, PSTR,int){WinExec("calc.exe",0);}

Nachstehend finden Sie noch ein kleines Beispiel, mit dem Sie testen können, ob eine Internet-Verbindung existiert oder nicht.
Hierbei müssen Sie außer der Datei windows.h auch noch WinInet.h in den Sourcecode einbinden und im Linker die Datei WinInet.lib angeben:

#include <windows.h> 
#include <WinInet.h>  // einzubindende Library : WinInet.lib

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int )
{
 DWORD dwFlags; 
 BOOL RetVal = InternetGetConnectedState(&dwFlags,0); 
 if(RetVal == TRUE) MessageBox(NULL, "Verbunden", "Internet", 0); 
 else               MessageBox(NULL, "Getrennt",  "Internet", 0);
 return 0;
}

Sie haben bisher windows.h und WinMain(...) als wesentliche Elemente der Windows-Programmierung kennen gelernt.
Die Basis ist also:

#include <windows.h

int WINAPI WinMain( HINSTANCE, HINSTANCE, PSTR, int ) 

  //Source-Code
  return 0; 
}