¿Incrustar a Winmain Entrypoint en una clase?
Pregunta
Me preguntaba, ¿es posible usar el punto de entrada de un programa Win32, el Winmain, como un método de clase? Por ejemplo;
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);
};
¡Gracias!
Solución
No. WinMain
no poder Sea miembro de la clase como punto de "entrada" del programa. Y para el caso WinMain
no poder ser en cualquier espacio de nombres (aparte del espacio de nombres global). Por ejemplo, incluso user::WinMain
Como se muestra abajo no poder ser el punto de "entrada" del programa.
namespace user
{
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int );
}
Punto de entrada del programa debe ser definido en el espacio de nombres global.
Sin embargo, puede tener una función con este nombre dentro de una clase (o en algún otro espacio de nombres), que puede llamar desde el actual punto de entrada WinMain
definido en el espacio de nombres global. PerocApp::WinMain
(o user::WinMain
) no es de ninguna manera el punto de "entrada" del programa.
Otros consejos
En primer lugar (y el wndproc) necesitaría ser static
miembros para que coincidan con los prototipos requeridos. El verdadero problema es lograr que el compilador se una a una función no global, ya que debe usar una opción de enlazador como MSVC's /entry:<symbol>
Para intentar vincular al miembro de la clase estática, sin embargo, podría molestar en la resolución del alcance ... Si no puede tener miembros estáticos, puede usar la entrada CRT WinMain para crear la instancia de su objeto y luego llamar a su WinMain
Miembro FUNC, OFC, es posible que no pueda unirse directamente a las bibliotecas estándar y necesitaría hacer el Init CRT usted mismo (aunque eso se puede obtener de la fuente CRT MSVC)