Pergunta

Eu estava me perguntando, é possível usar o ponto de entrada de um programa win32 - o WinMain - como um método de classe? Por exemplo;

class cApp {
public:
    cApp();
   ~cApp();

    cGuiManager* guiManager;
   cServerManager* serverManager;
    cAudioManager* audioManager;

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInst, LPSTR lpCmdLine, int nCmdShow);
    static LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
};

Obrigado!

Foi útil?

Solução

Não.WinMain não pode ser um membro da classe como ponto de "entrada" do programa.E, por falar nisso, WinMain não pode estar em qualquer namespace (exceto no namespace global).Por exemplo, mesmo user::WinMain conforme mostrado abaixo não pode ser o ponto de "entrada" do programa.

namespace user
{
     int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int );
}

O ponto de entrada do programa deve ser definido no namespace global.

No entanto, você pode ter uma função com esse nome dentro de uma classe (ou em algum outro namespace), que pode ser chamada a partir do WinMain do ponto de entrada real definido no namespace global.ButcApp::WinMain (ou user::WinMain) não é de forma alguma o ponto de "entrada" do programa.

Outras dicas

Em primeiro lugar, ele (e o WndProc) precisariam ser membros static para corresponder aos protótipos necessários.O verdadeiro problema é fazer com que o compilador se vincule a uma função não global, para isso você precisa usar uma opção de vinculador, como o /entry:<symbol> do msvc para tentar vincular ao membro da classe estática, no entanto, pode haver problemas na resolução do escopo ... Sevocê não pode ter membros estáticos, você pode usar a entrada winmain CRT para criar a instância do seu objeto e, em seguida, chamar sua função de membro WinMain, ofc, você pode não ser capaz de se vincular diretamente às bibliotecas padrão e precisafaça você mesmo o CRT init (embora possa ser obtido da fonte crt msvc)

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