c++ - example - Reemplazando WinMain() con la función main() en programas Win32
createwindowex example (4)
En primer lugar, GetModuleHandle(0)
proporciona el identificador del módulo ejecutable, que es el mismo que el argumento hInstance
de WinMain
.
Con el toolchaing de GNU (compilador de g ++), el código de conformidad estándar está bien.
La cadena de herramientas de Microsoft, sin embargo, solo acepta el código de conformidad estándar de forma predeterminada para un subsistema de consola ejecutable. Para crear un subsistema de GUI ejecutable con esta cadena de herramientas no conforme, utilizando un main
estándar, debe especificar un punto de entrada de la biblioteca de tiempo de ejecución de Microsoft que llame al main
estándar, a saber, mainCRTStartup
. Para una invocación de línea de comando que significa ...
cl myApp.cpp /link /entry:mainCRTStartup /subsystem:windows user32.lib
Como una cuestión práctica, para trabajar en la línea de comando, simplemente puede especificar el punto de entrada en la variable de entorno LINK
:
set LINK=/entry:mainCRTStartup
...
cl myApp.cpp /link /subsystem:windows user32.lib
Crear una configuración similar de conformidad estándar para Visual Studio quizás no sea deseable, ya que algunos tipos de proyectos de Visual Studio (principalmente MFC) requieren el uso de WinMain
o wWinMain
no estándar de wWinMain
.
Busqué un poco en StackOverflow y Google, pero no pude entender la idea. Quiero comenzar mi aplicación con este tipo de programación de usuario:
int main()
{
Window App("Test", 640, 480);
while(App.IsOpen())
{
// Do the stuff
}
}
Pero esto no es posible porque debería pasar la hInstance
y hPrevInstance
y otros parámetros a una función de WinMain
. En realidad, hay una clase de ventana que diseñé para hacer que la creación de la ventana sea un poco más fácil. Vi esta implementación en SFML, pero no sé cómo llegó a esto.
En este momento estoy usando la forma habitual:
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR, int)
{
Window App(hInst, hPrevInst, "Test", 640, 480);
while(App.IsOpen())
{
// Do the stuff
}
}
Gracias.
Puede usar main
estándar en una aplicación "Windows" (es decir, una aplicación de Windows del subsistema GUI) incluso con las herramientas de Microsoft, si agrega lo siguiente a las opciones del enlazador de Microsoft:
/subsystem:windows /ENTRY:mainCRTStartup
Tenga en cuenta que esto no es necesario para la cadena de herramientas GNU.
Aún así, para las herramientas de Microsoft, puede agregar esto como alternativa a su archivo principal:
#ifdef _MSC_VER
# pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif
@James McNellis le dice cómo obtener la hInstance.
GetModuleHandle(NULL)
te dará hInstance
. hPrevInstance
siempre es NULL
.
hInstance
es una excepción a la regla general "nunca usar variables globales". Normalmente, ninguna variable tiene lógicamente un ámbito que abarque todo el módulo. hInstance
, sin embargo, tiene, por definición, un alcance de módulo completo, por lo que en realidad la solución más lógica es crear una variable global para él e inicializarlo en WinMain
.
Como otros han sugerido, también puedes usar GetModuleHandle(NULL)
.