Win32 API Ciao mondo


Esempio

Le applicazioni Microsoft Windows vengono solitamente scritte come applicazioni console o applicazioni con finestre (esistono altri tipi come servizi e plug-in). La differenza per il programmatore è la differenza nell'interfaccia per il punto di ingresso principale per la sorgente dell'applicazione fornita dal programmatore.

Quando viene avviata un'applicazione C o C ++, il punto di ingresso dell'eseguibile utilizzato dal loader eseguibile è il runtime fornito dal compilatore. Il caricatore eseguibile legge l'eseguibile, esegue qualsiasi correzione dell'immagine necessaria e quindi richiama il punto di ingresso dell'eseguibile che per un programma C o C ++ è il runtime fornito dal compilatore.

Il punto di ingresso dell'eseguibile richiamato dal loader non è il punto di ingresso principale fornito dal programmatore dell'applicazione, ma è invece il runtime fornito dal compilatore e dal linker che crea l'eseguibile. Il runtime imposta l'ambiente per l'applicazione e quindi chiama il punto di ingresso principale fornito dal programmatore.

Un'applicazione console Windows può avere diverse interfacce leggermente diverse per il punto di ingresso principale fornito dal programmatore. La differenza tra questi è se il punto di ingresso principale è il tradizionale int main (int argc, char *argv[]) o se è la versione specifica di Windows di int _tmain(int argc, _TCHAR* argv[]) che fornisce un'ampia caratteri nei parametri dell'applicazione. Se si genera un progetto di applicazione di console Win32 Windows utilizzando Visual Studio, l'origine generata sarà la versione specifica di Windows.

Un'applicazione Windows (GUI) ha un'interfaccia diversa per il punto di ingresso principale fornito dal programmatore. Questo punto di ingresso principale fornito dal programmatore ha un'interfaccia più complessa perché il runtime imposta un ambiente GUI e fornisce informazioni aggiuntive insieme ai parametri dell'applicazione.

Questo esempio spiega l'interfaccia del punto di ingresso principale della finestra di Windows (GUI). Per esplorare questi argomenti dovresti avere:

  • un IDE con compilatore (preferibilmente Visual Studio)
  • C conoscenza

Creare un progetto Windows Win32 vuoto (GUI, non console) utilizzando l'IDE. Le impostazioni del progetto devono essere impostate per un'applicazione finestra (non un'applicazione console) affinché il linker possa collegarsi al runtime corretto. Creare un file main.c aggiungendolo al progetto e quindi digitare il seguente codice:

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
{
    return MessageBox(NULL, "hello, world", "caption", 0);
}

Questo è il nostro programma Win32 "Hello, world". Il primo passo è includere i file di intestazione di Windows. L'intestazione principale per tutti i Windows è windows.h , ma ce ne sono altri.

WinMain è diverso da uno standard int main() utilizzato con un'applicazione console. Ci sono più parametri usati nell'interfaccia e, cosa più importante, il punto di ingresso principale per un'applicazione di una finestra utilizza una convenzione di chiamata diversa dallo standard C / C ++.

Il qualificatore APIENTRY indica la convenzione di chiamata, che è l'ordine in cui gli argomenti vengono APIENTRY nello stack . Per impostazione predefinita, la convenzione di chiamata è la convenzione C standard indicata da __cdecl . Tuttavia, Microsoft utilizza un diverso tipo di convenzione di chiamata, la convenzione PASCAL, per le funzioni dell'API di Windows che è indicata dal qualificatore __stdcall . APIENTRY è un nome definito per __stdcall in uno dei file di intestazione inclusi da windows.h (si veda anche What is __stdcall? ).

Gli argomenti successivi a WinMain sono i seguenti:

  • hInst: l'handle dell'istanza
  • hInstPrev: l'handle dell'istanza precedente. Non più utilizzato.
  • cmdline: Argomenti della riga di comando (vedi Passare argomenti WinMain (o wWinMain) al normale principale )
  • cmdshow: indica se deve essere visualizzata una finestra.

Non usiamo ancora nessuno di questi argomenti.

All'interno di WinMain() , c'è una chiamata a MessageBox() , che visualizza una semplice finestra di dialogo con un messaggio, una finestra di messaggio. Il primo argomento è l'handle della finestra del proprietario. Dato che non abbiamo ancora la nostra finestra, passa NULL . Il secondo argomento è il corpo del testo. Il terzo argomento è la didascalia e il quarto argomento contiene le flag. Quando viene passato 0, viene visualizzata una finestra di messaggio predefinita. Lo schema seguente mostra la finestra di dialogo della finestra di messaggio.

inserisci la descrizione dell'immagine qui

Buoni collegamenti:

† Solo su sistemi a 32 bit. Altre architetture hanno diverse convenzioni di chiamata.