Pergunta

aplicativos do Windows GUI escrito em C / C ++ Tem 'WinMain' como um ponto de entrada (em vez de 'main'). Meu entendimento disto é que o compilador gera uma função 'main' para ser chamado pelo C Runtime. Este 'principais' conjuntos de funções até o ambiente necessário para o GUI e chamadas em 'WinMain' (especificando as alças de instância etc.).

Em suma, acredito console e inicialização do aplicativo GUI para diferir da seguinte maneira:

aplicativo Console: Tempo de execução C -> função 'principal (codificada mão-)

Aplicação de GUI: Tempo de execução C -> função 'principal (compilador-gerado) -> função 'WinMain'(codificada mão-)

Gostaria de ambos validar esse entendimento e descobrir como posso entregá-código de uma interface gráfica do Windows com apenas uma função 'main' (ou seja, sem ter que escrever 'WinMain').

Foi útil?

Solução

Você tem uma compreensão incorreta. A diferença entre principal e WinMain, além de algum código de inicialização differet, são os parâmetros passados ??para ele.

principais esta aparência:

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

Enquanto winmain esta aparência:

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

Algo tem de configurar os parâmetros e fazer a chamada, e isso é o código de inicialização. Quando você compilar e vincular um programa, um dos parâmetros vinculador é o ponto de entrada, e que será, dependendo de um console ou aplicativo GUI, um pouco diferente do código de inicialização.

Você certamente pode escrever seu próprio código de inicialização, basta ir em seu c ++ diretório fonte visual e você pode encontrar o código de inicialização, ele é chamado crt0.c e é na VC \ CRT \ src diretório.

Outras dicas

Com apenas principal, você não pode código WinMain. Para justificativas, na sequência de declarações foram tiradas de http://blogs.msdn.com/oldnewthing/archive/ 2007/12/03 / 6644060.aspx

[na programação do Windows,] Por que não foi o ponto de entrada do aplicativo chamado a Principal? Bem, para uma coisa, o nome principal foi já tomada, e O Windows não tem autoridade para reservar uma definição alternativa. Não havia linguagem C comité de normalização na época; C foi de o que Dennis disse que era, e foi quase garantido que Dennis iria tomar quaisquer medidas especiais para preservar o código-fonte do Windows compatibilidade em qualquer versão futura da linguagem C. Desde K & R não especificou que as implementações poderia estender as formas aceitáveis da função principal, que era inteiramente possível que houve uma legal compilador C que rejeitou programas que declararam principal incorretamente. o padrão de linguagem corrente C permite explicitamente aplicação específica definições alternativas para o principal, mas exigindo que todos os compiladores para apoio esta nova versão específicos para Windows, a fim de compilar os programas do Windows se gratuitamente restringir o conjunto de compiladores que você poderia usar para programas de escrita do Windows.

Se você conseguiu superar esse obstáculo, você teria o problema que a versão Windows do principal teria que ser algo como isto:

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

Devido à forma como C ligação foi realizada, todas as variações de uma função teve que concordar com a parâmetros que tinham em comum. Isto significa que a versão do Windows teria que adicionar os seus parâmetros para o fim da mais longa existente versão do principal, e em seguida, você teria que cruzar os dedos e esperança que a linguagem C não adicionou uma outra versão alternativa do principal. E se você passou por esta via, os dedos cruzados falhei com você, porque ele se transforma que um terceiro parâmetro foi adicionado ao principal, algum tempo depois, e em conflito com a sua versão do Windows-friendly.

Suponha que você conseguiu convencer Dennis não permitir que versão de três parâmetro principal. Você ainda tem que vir para cima com os primeiros dois parâmetros, o que significa que o código de inicialização de cada programa precisa conter um analisador de linha de comando. Para trás nos dias 16 bits, pessoas scrimped para salvar cada byte. Dizendo-lhes: "Oh, e toda a sua programas vão ser 2KB maior" provavelmente não iria fazer um monte de amigos. Quer dizer, isso é quatro setores de I / O fora de um disquete!

Mas, provavelmente, a razão pela qual o ponto de entrada do Windows foi dado um nome diferente é enfatizar que é uma execução diferente meio Ambiente. Se fosse chamado principal, as pessoas levaria programas em C projetado para um ambiente console, jogá-los em seu o Windows compilador, e, em seguida, executá-los, com resultados desastrosos.

Espero que isso limpa suas dúvidas.

Ele funciona de outra maneira. Há um arquivo objeto estaticamente ligado que vem com o compilador que contém o ponto de entrada real. Esse ponto de entrada faz a inicialização e, em seguida, chama o seu ponto de entrada (ou seja, WinMain).

O que espere parte estática a chamada pode ser tweakable. Por exemplo, no Visual Studio há um campo para o nome de ponto de entrada nas configurações do vinculador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top