Domanda

Le applicazioni GUI di Windows scritte in C/C++ hanno "WinMain" come punto di ingresso (anziché "principale").La mia comprensione di ciò è che il compilatore genera una funzione "principale" che deve essere chiamata dal runtime C.Questa funzione "main" configura l'ambiente necessario per la GUI e richiama "WinMain" (specificando gli handle dell'istanza, ecc.).

In breve, credo che l'avvio della console e dell'applicazione GUI differisca nel modo seguente:

Applicazione console:Runtime C --> funzione 'principale' (codificata manualmente)

Applicazione GUI:Runtime C --> funzione 'main' (generata dal compilatore) --> funzione 'WinMain' (codificata manualmente)

Vorrei sia convalidare questa comprensione sia scoprire come posso codificare manualmente una GUI di Windows con solo una funzione "principale" (ad es.senza dover scrivere 'WinMain').

È stato utile?

Soluzione

Hai una comprensione errata. La differenza tra principale e WinMain, a parte qualche codice di inizializzazione differet, sono i parametri passati a esso.

principale appare così:

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

Mentre WinMain assomiglia a questo:

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

Qualcosa deve configurazione quei parametri ed effettuare la chiamata, e questo è il codice di avvio. Quando si compila e collegare un programma, uno dei parametri linker è il punto di ingresso, e che sarà, a seconda di una console o GUI app, un po 'diverso di codice di avvio.

Si può certamente scrivere il proprio codice di avvio, basta andare nella directory di origine di Visual C ++ e si può trovare il codice di avvio, si chiama crt0.c ed è nella directory VC \ crt \ src.

Altri suggerimenti

Con Just main, non puoi codificare Winmain.Per le giustificazioni, sono state tratte le seguenti dichiarazioni http://blogs.msdn.com/oldnewthing/archive/2007/12/03/6644060.aspx

Nella programmazione di Windows,] Perché il punto di ingresso dell'applicazione non era chiamato Main?Bene, per prima cosa, il nome Main era già preso e Windows non aveva l'autorità di riservare una definizione alternativa.All'epoca non esisteva un comitato per la standardizzazione del linguaggio C;C era ciò che Dennis ha detto che lo era, e non era certo garantito che Dennis avrebbe adottato passi speciali per preservare la compatibilità del codice sorgente di Windows in qualsiasi versione futura della lingua C.Poiché K&R non ha specificato che le implementazioni potessero estendere le forme accettabili della funzione principale, era del tutto possibile che vi fosse un compilatore C legale che respingeva i programmi che dichiaravano in modo errato principale.L'attuale standard del linguaggio C consente esplicitamente definizioni alternative specifiche per l'implementazione per Main, ma che richiede a tutti i compilatori di supportare questa nuova versione specifica di Windows al fine di compilare programmi Windows limiterebbe gratuitamente l'insieme dei compilatori che potresti utilizzare per la scrittura di programmi Windows.

Se riuscissi a superare quell'ostacolo, avresti il ​​problema che la versione di Windows di Main dovrebbe essere qualcosa del genere:

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

A causa del modo in cui è stato eseguito il collegamento C, tutte le variazioni di una funzione dovevano concordare i parametri che avevano in comune.Ciò significa che la versione di Windows dovrebbe aggiungere i suoi parametri alla fine della versione più lunga esistente di Main, e quindi dovresti attraversare le dita e sperare che la lingua C non abbia mai aggiunto un'altra versione alternativa di Main.Se hai percorso questo percorso, le dita incrociate non ti hanno fallito, perché si scopre che un terzo parametro è stato aggiunto al principale qualche tempo dopo ed è in conflitto con la tua versione a misura di Windows.

Supponiamo che tu sia riuscito a convincere Dennis a non consentire quella versione a tre parametri di Main.Devi ancora trovare quei primi due parametri, il che significa che il codice di avvio di ogni programma deve contenere un parser di riga di comando.Nei giorni a 16 bit, le persone hanno scrutato per salvare ogni byte.Dire loro: "Oh, e tutti i tuoi programmi saranno 2kb più grandi" probabilmente non ti renderebbero molti amici.Voglio dire, sono quattro settori di I/O su un floppy disk!

Ma probabilmente il motivo per cui al punto di ingresso di Windows è stato dato un nome diverso è sottolineare che si tratta di un ambiente di esecuzione diverso.Se fosse chiamato Main, le persone prendono programmi C progettati per un ambiente di console, gettali nel loro compilatore Windows e quindi eseguirli, con risultati disastrosi.

Spero che questo chiarisca i tuoi dubbi.

Funziona il contrario. C'è un file oggetto collegato in modo statico che viene fornito con il compilatore che contiene il punto di ingresso reale. Questo punto di ingresso fa inizializzazione e quindi chiama il tuo punto di ingresso (ossia WinMain).

Cosa che parte statica si aspetta di chiamare può essere tweakable. Ad esempio, in Visual Studio c'è un campo per il nome del punto di ingresso nelle impostazioni di linker.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top