2011-01-13 18 views
16

Cuáles son la diferencia entre estos 2 función ?:"APIENTRY tWinMain" y "WINAPI WinMain" diferencia

int APIENTRY _tWinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPTSTR lpCmdLine, 
        int  nCmdShow) 

int WINAPI WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPTSTR lpCmdLine, 
        int  nCmdShow) 
+0

si ha definido _UNICODE, entonces el segundo ejemplo sería error porque LPTSTR sería WSTR y no encajaría con WinMain, tanto WINAPI y APIENTRY se definen como __stdcall – Kaije

+0

clic derecho en tWinMain -> elija ir a la definición ... – Jimbo

+7

Su declaración WinMain() no es correcta, el 3er argumento es LPSTR. Ambos son arcaicos, deberías usar wWinMain hoy. –

Respuesta

41

_tWinMain es sólo un atajo #define en tchar.h a la versión adecuada de WinMain.

Si se define _UNICODE, entonces _tWinMain se expande a wWinMain. De lo contrario, _tWinMain es lo mismo que WinMain.

La macro correspondiente es como la siguiente (en realidad hay un montón de otros códigos intercalados):

#ifdef _UNICODE 
#define _tWinMain wWinMain 
#else 
#define _tWinMain WinMain 
#endif 
+0

¡Esta es la respuesta correcta! – Nawaz

1

De this link:

tWinMain realmente hace tomar el parámetro hPrevInstance, pero que parámetro no se usa.

_tWinMain es simplemente un #define a WinMain (en TCHAR.h). No hay diferencia entre dos.

y

tWinMain se define a WinMain éste no se ha definido, y para wWinMain si lo es. su propósito es le permite escribir el código que construirá tanto en ansi como bajo Unicode.

+2

Otras publicaciones más abajo en la misma página que enlaza para sugerir que no son exactamente iguales. La diferencia entre los dos depende de si se define '_UNICODE'. –

+0

@Cody Sí, buena captura. – chrisaycock

16

La diferencia es la codificación de los parámetros, que son completamente redundantes de todos modos. Simplemente tirar a la basura los parámetros y en su lugar utilizar el siguiente, donde el control de la codificación:

hInstance es sólo GetModuleHandle(0)

hPrevInstance no es válido en Win32 todos modos

lpCmdLine está disponible tanto en ANSI y Unicode, a través GetCommandLineA() y GetCommandLineW(), respectivamente

nCmdShow es el parámetro wShowWindow de la estructura de STARTUPINFO. Nuevamente, las variantes ANSI y Unicode, a las que se accede usando GetStartupInfoA(STARTUPINFOA*) y GetStartupInfoW(STARTUPINFOW*).

Y al utilizar las API de Win32 para acceder a ellas, es probable que guarde algunas variables globales, como la que guardaba cuidadosamente el identificador de instancia que creía que solo estaba disponible para WinMain.

+0

Esto debería tener más votos ascendentes ... – Kevin

Cuestiones relacionadas