Punto di ingresso dell'applicazione WinMain

Ogni programma Windows include una funzione di ingresso denominata WinMain o wWinMain. Il codice seguente mostra la firma per wWinMain:

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

I quattro parametri wWinMain sono i seguenti:

  • hInstance è l'handle di un'istanza o di un handle in un modulo. Il sistema operativo usa questo valore per identificare l'eseguibile o l'EXE quando viene caricato in memoria. Alcune funzioni di Windows richiedono l'handle dell'istanza, ad esempio per caricare icone o bitmap.
  • hPrevInstance non ha alcun significato. È stato usato in Windows a 16 bit, ma ora è sempre zero.
  • pCmdLine contiene gli argomenti della riga di comando come stringa Unicode.
  • nCmdShow è un flag che indica se la finestra dell'applicazione principale è ridotta a icona, ingrandita o visualizzata normalmente.

La funzione restituisce un int valore. Il sistema operativo non usa il valore restituito, ma è possibile usare il valore per passare un codice di stato a un altro programma.

Una convenzione chiamante, ad esempio WINAPI, definisce il modo in cui una funzione riceve i parametri dal chiamante. Ad esempio, la convenzione chiamante definisce l'ordine di visualizzazione dei parametri nello stack. Assicurarsi di dichiarare la funzione wWinMain , come illustrato nell'esempio precedente.

La funzione WinMain è uguale a wWinMain, ad eccezione degli argomenti della riga di comando passati come stringa ANSI. La stringa Unicode è preferita. È possibile usare la funzione ANSI WinMain anche se si compila il programma come Unicode. Per ottenere una copia Unicode degli argomenti della riga di comando, chiamare la funzione GetCommandLine . Questa funzione restituisce tutti gli argomenti in una singola stringa. Se si desidera che gli argomenti come matrice argv-style, passare questa stringa a CommandLineToArgvW.

Come il compilatore sa richiamare wWinMain anziché la funzione principale standard? Ciò che accade in realtà è che la libreria di runtime di Microsoft C (CRT) fornisce un'implementazione di principale che chiama WinMain o wWinMain.

CRT esegue altre operazioni all'interno del principale. Ad esempio, chiama tutti gli inizializzatori statici prima di wWinMain. Anche se è possibile indicare al linker di usare una funzione di punto di ingresso diversa, è consigliabile usare il valore predefinito se si collega a CRT. In caso contrario, il codice di inizializzazione CRT viene ignorato, con risultati imprevedibili, ad esempio gli oggetti globali non inizializzati correttamente.

Il codice seguente mostra una funzione WinMain vuota:

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

Dopo aver creato il punto di ingresso e comprendere alcune delle convenzioni di base e di codifica, è possibile creare il primo programma Windows.