Frage

Windows-GUI-Anwendungen in C / C ++ geschrieben 'WinMain' als Einstiegspunkt haben (eher als 'main'). Mein Verständnis davon ist, dass der Compiler eine ‚Haupt‘ Funktion erzeugt durch die C Laufzeit aufgerufen werden. Diese ‚main‘ Funktion stellt die notwendige Umgebung für die GUI auf und ruft in ‚WinMain‘ (die Instanz spezifiziert Griffe usw.).

Kurz gesagt, ich glaube, Konsole und GUI Start der Anwendung in der folgenden Art und Weise zu unterscheiden:

Konsolenanwendung: C Runtime -> 'main' Funktion (Hand codiert)

GUI-Anwendung: C Runtime -> 'main' Funktion (Compiler generierte) -> 'WinMain' -Funktion (Hand codiert)

Ich mag sowohl dieses Verständnis validieren und herauszufinden, wie ich ein Windows-GUI mit nur einem ‚main‘ Funktion-Code übergeben kann (das heißt ohne ‚WinMain‘ schreiben).

War es hilfreich?

Lösung

Sie haben ein falsches Verständnis. Der Unterschied zwischen Haupt- und WinMain, abgesehen von einigen differet Initialisierungscode, ist die Parameter an sie übergeben.

Haupt sieht wie folgt aus:

int main(int argc, char* argv[]);

Während WinMain sieht wie folgt aus:

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
);

Es muss etwas Setup die Parameter und den Anruf tätigen, und das ist der Startcode. Wenn Sie ein Programm kompilieren und verknüpfen, eine der Linker-Parameter ist der Einstiegspunkt, und das wird in Abhängigkeit von einer Konsole oder GUI-Anwendung, einem anderen Bit-Startcode.

Sie können Ihren eigenen Startcode sicher schreiben, gehen Sie einfach in Ihr Visual C ++ Quellverzeichnis und Sie können den Startcode finden, es heißt crt0.c und es ist in dem VC \ crt \ src-Verzeichnis.

Andere Tipps

Mit nur Haupt, können Sie nicht winmain kodieren. Für Rechtfertigungen, wurden nach Aussagen entnommen aus   http://blogs.msdn.com/oldnewthing/archive/ 2007/12 / 03 / 6644060.aspx

  

[In Windows Programmierung,] Warum wurde nicht Punkt der Anwendung Eintrag genannt   Main? Nun, für eine Sache, wurde der Name Haupt bereits genommen und   Windows hat die Behörde nicht eine alternative Definition zu reservieren.   Es gab keine Sprache C Normenausschuss damals; C war   was Dennis sagte, es war, und es war kaum gewährleistet, dass Dennis   würde alle besonderen Schritte Windows-Quellcode zu erhalten   Kompatibilität in einer zukünftigen Version der C-Sprache. Da K & R   hat nicht angegeben, dass Implementierungen die zulässigen Formen verlängern könnte   der Hauptfunktion war, ist es durchaus möglich, dass eine juristische war dort   C-Compiler, die Programme abgelehnt, das Haupt falsch erklärt. Das   aktuelle Sprache C-Standard erlaubt explizit Umsetzung spezifische   die alternative Definitionen für die wichtigsten, aber alle Compiler erfordern zu unterstützen   Diese neue Windows-spezifische Version, um Windows-Programme zu kompilieren   wäre es wirklich die Menge der Compiler beschränken Sie verwenden könnten   Schreiben Windows-Programme.

     

Wenn Sie dieses Hindernis zu überwinden verwaltet, würden Sie das Problem haben, dass   die Windows-Version von Haupt in etwa so sein müßte:

int main(int argc, char *argv[], HINSTANCE hinst,
         HINSTANCE hinstPrev, int nCmdShow);
     

Durch die Art und Weise C-Bindung durchgeführt wurde, sind alle Varianten einer Funktion hatte auf die zustimmen   Parameter, die sie gemeinsam hatten. Dies bedeutet, dass die Windows-Version   hätte seine Parameter an das Ende der längsten hinzuzufügen bestehenden   Version von Haupt-, und dann müßten Sie Ihre Finger und Hoffnung überqueren   dass die C-Sprache hinzugefügt nie wieder eine alternative Version von Haupt. Wenn   Sie diesen Weg gingen, Ihre gekreuzten Fingern gescheitert Sie, denn es stellt sich   darauf hin, dass ein dritte Parameter wurde einige Zeit später zur Haupt hinzugefügt, und es   mit Ihrer Windows-Version in Konflikt gerät.

     

Angenommen, Sie verwalten Dennis davon zu überzeugen, nicht zu erlauben,   Drei-Parameter-Version Haupt. Sie haben noch mit jenen kommen   ersten beiden Parameter, die, dass jedes Programm die Startcode-Mittel   muss eine Befehlszeilen-Parser enthalten. Zurück in den 16-Bit-Tage,   Menschen scrimped jedes Byte zu speichern. Ihnen zu sagen: „Oh, und alle Ihre   Programme werden würde 2 KB größer“sein wahrscheinlich machen Sie nicht viel   von Freunden. Ich meine, das sind vier Sektoren I / O eine Diskette aus!

     

Aber wahrscheinlich der Grund, warum der Windows-Eintrittspunkt gegeben wurde ein   andere Namen zu betonen, dass es eine andere Ausführung ist   Umgebung. Wenn es Haupt genannt wurden, würden die Menschen nehmen C-Programme   für eine Konsole-Umgebung entwickelt, werfen sie in ihre Windows-   Compiler, und dann läuft sie, mit katastrophalen Folgen.

Hope dies löscht Ihre Zweifel.

Es funktioniert anders. Es gibt eine statisch gelinkte Objekt-Datei, die mit dem Compiler kommt, dass der tatsächlichen Eintrittspunkt hält. Das Einstiegspunkt tut Initialisierung und ruft dann Ihren Eintrittspunkt (das heißt WinMain).

Was ist der statische Teil erwartet tweakable zu nennen sein. Zum Beispiel in Visual Studio gibt es ein Feld für die Eingabe Punktnamen in den Linker-Einstellungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top