Einstiegspunkt der WinMain-Anwendung

Jedes Windows-Programm enthält eine Einstiegspunktfunktion mit dem Namen WinMain oder wWinMain. Der folgende Code zeigt die Signatur für wWinMain:

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);

Die vier wWinMain-Parameter sind wie folgt:

  • hInstance ist das Handle für eine Instanz oder ein Handle für ein Modul. Das Betriebssystem verwendet diesen Wert, um die ausführbare Datei oder EXE zu identifizieren, wenn sie in den Arbeitsspeicher geladen wird. Bestimmte Windows-Funktionen benötigen das Instanzhandle, z. B. zum Laden von Symbolen oder Bitmaps.
  • hPrevInstance hat keine Bedeutung. Es wurde in 16-Bit-Windows verwendet, ist aber jetzt immer 0.
  • pCmdLine enthält die Befehlszeilenargumente als Unicode-Zeichenfolge.
  • nCmdShow ist ein Flag, das angibt, ob das Hauptanwendungsfenster minimiert, maximiert oder normal angezeigt wird.

Die Funktion gibt einen int Wert zurück. Das Betriebssystem verwendet nicht den Rückgabewert, aber Sie können den Wert verwenden, um einen Statuscode an ein anderes Programm zu übergeben.

Eine Aufrufkonvention wie definiert, WINAPIwie eine Funktion Parameter vom Aufrufer empfängt. Beispielsweise definiert die aufrufende Konvention die Reihenfolge, in der Parameter auf dem Stapel angezeigt werden. Stellen Sie sicher, dass Sie Ihre wWinMain-Funktion deklarieren, wie im vorherigen Beispiel gezeigt.

Die WinMain-Funktion ist identisch mit wWinMain, mit dem Unterschied, dass die Befehlszeilenargumente als ANSI-Zeichenfolge übergeben werden. Die Unicode-Zeichenfolge wird bevorzugt. Sie können die ANSI WinMain-Funktion auch dann verwenden, wenn Sie Ihr Programm als Unicode kompilieren. Um eine Unicode-Kopie der Befehlszeilenargumente abzurufen, rufen Sie die GetCommandLine-Funktion auf. Diese Funktion gibt alle Argumente in einer einzelnen Zeichenfolge zurück. Wenn Sie die Argumente als Array im Argv-Stil möchten, übergeben Sie diese Zeichenfolge an CommandLineToArgvW.

Woher weiß der Compiler , wWinMain anstelle der Standardhauptfunktion aufzurufen? Was tatsächlich geschieht, ist, dass die Microsoft C Runtime Library (CRT) eine Implementierung von main bereitstellt, die entweder WinMain oder wWinMain aufruft.

Das CRT erledigt im Main noch etwas mehr Arbeit. Beispielsweise werden alle statischen Initialisierer vor wWinMain aufgerufen. Obwohl Sie dem Linker anweisen können, eine andere Einstiegspunktfunktion zu verwenden, sollten Sie die Standardeinstellung verwenden, wenn Sie mit dem CRT verknüpfen. Andernfalls wird der CRT-Initialisierungscode übersprungen, wobei unvorhersehbare Ergebnisse wie globale Objekte nicht ordnungsgemäß initialisiert werden.

Der folgende Code zeigt eine leere WinMain-Funktion :

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, int nCmdShow)
{
    return 0;
}

Nachdem Sie nun den Einstiegspunkt haben und einige der grundlegenden Terminologie- und Codierungskonventionen kennen, können Sie Ihr erstes Windows-Programm erstellen.