Compartilhar 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 identificador para um módulo. O sistema operacional usa esse valor para identificar o executável ou EXE quando ele é carregado na memória. Determinadas 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 está minimizada, maximizada ou mostrada normalmente.

A função retorna um int valor . O sistema operacional não usa o valor retornado, 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. Declare sua função wWinMain conforme 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 é preferencial. Você pode usar a função ANSI WinMain mesmo se 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 você quiser os argumentos como uma matriz de estilo argv, passe essa cadeia de caracteres para CommandLineToArgvW.

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

O CRT faz mais algum trabalho dentro do principal. Por exemplo, ele chama todos os inicializadores estáticos antes de wWinMain. Embora você possa instruir o vinculador a usar uma função de ponto de entrada diferente, você deverá usar o padrão se vincular ao CRT. Caso contrário, o código de inicialização crt é ignorado, com resultados imprevisíveis, como objetos globais, não sendo inicializados corretamente.

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 convenções básicas de terminologia e codificação, está pronto para Criar seu primeiro programa do Windows.