2009-11-24 21 views
16

La única diferencia es que Winmain toma char * para el parámetro lpCmdLine, mientras que wWinMain toma wchar_t *.Diferencia entre WinMain y wWinMain

En Windows XP, si una entrada de aplicación es WinMain, ¿Windows convierte la línea de comando de Unicode a Ansi y la pasa a la aplicación?

Si el parámetro de la línea de comando debe estar en Unicode (por ejemplo, nombre de archivo Unicode, la conversión hará que falten algunos caracteres), ¿significa eso que debo usar wWinMain como la función de entrada?

Respuesta

12

En Windows XP, si una entrada de aplicación es WinMain, ¿Windows convierte la línea de comandos de Unicode a Ansi y la pasa a la aplicación?

Sí.

Si el parámetro de la línea de comando debe estar en Unicode (por ejemplo, nombre de archivo Unicode, la conversión hará que falten algunos caracteres), ¿eso significa que debo usar wWinMain como función de entrada?

Sí, debe hacerlo, si desea manejar correctamente los argumentos Unicode en su programa.

La documentación a WinMain() on MSDN también está de acuerdo.

Puede, sin embargo, también utilizar GetCommandLineW para recuperar la línea de comando específicamente en Unicode.

-1

¡Windows XP en adelante es unicode por defecto! Y por lo tanto, no se requiere conversión. El cargador de tiempo de ejecución de C++ se ocupa del argumento que pasa a la aplicación. La API estándar de Win32 dicta que la entrada principal es WinMain (...).

+4

"Tenga en cuenta que lpCmdLine utiliza el tipo de datos LPSTR en lugar del tipo de datos LPTSTR. Esto significa que WinMain no puede ser utilizado por programas Unicode". (http://msdn.microsoft.com/en-us/library/ms633559.aspx) – Joey

+0

Gracias Johannes por la información y por recordarme. – t0mm13b

+1

Windows NT4 es Unicode por defecto :) –

1

WinMain/wWinMain no es el verdadero punto de entrada de Windows. Windows simplemente llama a la función especificada en el encabezado PE con cero parámetros.

Al utilizar la cadena de herramientas de Microsoft, esto es void WinMainCRTStartup() { ... } cuando está creando una aplicación GUI y se proporciona para usted a menos que se vincule con /Zl.

El valor predeterminado WinMainCRTStartup código creado por Visual C++ inicializa la biblioteca de tiempo de ejecución C, llama a los constructores mundiales (si lo hay) y luego llama a su función WinMain/wWinMain con un HINSTANCE de GetModuleHandle(NULL), la línea de comandos de GetCommandLineA/W() (sin esperar más el nombre de archivo en la línea de comando) y el comando show desde GetStartupInfo.

La única diferencia entre WinMain y wWinMain es la cadena de línea de comandos y debe usar wWinMain en aplicaciones Unicode (y todas las aplicaciones creadas actualmente deben usar Unicode). Por supuesto, puede llamar manualmente al GetCommandLineW() en WinMain y analizarlo usted mismo si realmente lo desea.

En Windows NT/2000/XP y posterior, la línea de comandos es una cadena Unicode internamente y WinMain/GetCommandLineA() le da una versión convertida de esto que podría no representar correctamente todos los caracteres. En Windows 95/98/ME es al revés, pero GetCommandLineW() siempre puede convertir cada carácter de GetCommandLineA().