Incorporando o ponto de entrada WinMain em uma classe?
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!
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)