Partilhar via


O ponto de entrada do aplicativo WinMain

Cada programa do Windows inclui uma função de ponto de entrada chamada WinMain ou wWinMain. O código a seguir mostra a assinatura para wWinMain:

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

Os quatro parâmetros wWinMain são os seguintes:

  • hInstance é o identificador de uma instância ou de um módulo. O sistema operacional usa esse valor para identificar o executável ou EXE quando ele é carregado na memória. Certas funções do Windows precisam do identificador de instância, por exemplo, para carregar ícones ou bitmaps.
  • hPrevInstance não tem significado. Ele foi usado no Windows de 16 bits, mas agora é sempre zero.
  • pCmdLine contém os argumentos de linha de comando como uma cadeia de caracteres Unicode.
  • nCmdShow é um sinalizador que indica se a janela principal do aplicativo é minimizada, maximizada ou mostrada normalmente.

A função retorna um valor int. O sistema operacional não usa o valor de retorno, mas você pode usar o valor para passar um código de status para outro programa.

Uma convenção de chamada , como WINAPI, define como uma função recebe parâmetros do chamador. Por exemplo, a convenção de chamada define a ordem em que os parâmetros aparecem na pilha. Certifique-se de declarar a sua função wWinMain como mostrado no exemplo anterior.

A função WinMain é a mesma que wWinMain, exceto que os argumentos de linha de comando são passados como uma cadeia de caracteres ANSI. A cadeia de caracteres Unicode é preferida. Você pode usar a função ANSI WinMain mesmo se você compilar seu programa como Unicode. Para obter uma cópia Unicode dos argumentos de linha de comando, chame a função GetCommandLine. Essa função retorna todos os argumentos em uma única cadeia de caracteres. Se quiser os argumentos como uma matriz no estilo argv, passa esta cadeia de caracteres para CommandLineToArgvW.

Como o compilador sabe invocar wWinMain em vez da função padrão principal? O que realmente acontece é que a biblioteca de tempo de execução do Microsoft C (CRT) fornece uma implementação de main que chama WinMain ou wWinMain.

O CRT faz mais algum trabalho dentro principal. Por exemplo, ele chama quaisquer inicializadores estáticos antes de wWinMain. Embora seja possível informar o ligador para usar uma função de entrada diferente, deve-se utilizar o padrão ao ligar ao CRT. Caso contrário, o código de inicialização CRT é ignorado, resultando em resultados imprevisíveis, como a incorreta inicialização de objetos globais.

O código a seguir mostra uma função WinMain vazia:

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

Agora que você tem o ponto de entrada e entende algumas das terminologias básicas e convenções de codificação, está pronto para Criar seu primeiro programa do Windows.