2012-05-05 3 views
5

Warum sollte der Konstruktor meiner abgeleiteten CWinApp aufgerufen werden, bevor Hauptfunktion gestartet wird?
Warum kann es sein, nicht so etwas wie:Warum muss ich in MFC eine globale Instanz von CWinApp erstellen?

int WinMain() 
{ 
    CMainFrame* pMainFrame = new CMainFrame; 
    // etc ... 
} 

Ich bin für den technischen Grund suchen, die dieses Verhalten zwingt.
Bearbeiten:
Um klarer zu machen - Wenn ich Win32 API ohne MFC verwenden, wird das Hauptfenster in WinMain erstellt, was ist der Unterschied?

+0

Vermutlich wird der Konstruktor für 'CWinApp' ausgeführt * bevor * die' main' Funktion ausgeführt wird. Aber ich bin mir nicht sicher. Ich habe das nie versucht, um zu sehen, ob es funktioniert. Hast du? –

+0

@CodyGray Ja, ich habe es versucht. Die Anwendung stürzt innerhalb von AfxWinMain ab –

+0

Ah ja, genau wie Frederics Antwort voraussagt. Der Konstruktor für 'CWinApp' setzt den Wert einiger Zustandsvariablen, die von' AfxWinMain' erwartet werden. –

Antwort

3

Das liegt daran, dass die MFC-Designer entschieden haben, den Anwendungseingangspunkt (WinMain(), nicht main()) in der Bibliothek selbst bereitzustellen, damit Benutzer keinen schreiben müssen.

Die Initialisierungs- und Beendigungslogik der Anwendung wird dann in die Methoden InitInstance() und ExitInstance() der Instanz eines vom Benutzer bereitgestellten CWinApp-abgeleiteten Singleton verschoben. Diese Instanz muss existieren, bevor WinMain() ausgeführt wird, weil sie die oben genannten Methoden aufruft (und Run(), um in die Nachrichtenschleife einzutreten) und sie verwendet, um den Status zu speichern (wie das nCmdShow Argument, das sie empfängt).

Die Definition der CWinApp -externen Instanz im globalen Gültigkeitsbereich ist eine einfache Möglichkeit, um sicherzustellen, dass sie zu dem Zeitpunkt existiert, zu dem WinMain() ausgeführt wird.

This article hat zusätzliche Details zu dem, was unter der Haube passiert, wenn eine MFC-Anwendung gestartet wird.

Verwandte Themen