2010-11-04 26 views
11

Así que entrar en la nueva milenios Reescribí mi código C++ con:de Windows argv Unicode comandos

int main(int argc, wchar_t **argv) 

Si se construye con Unicode o MBCS opciones a continuación, cuando la aplicación se ejecuta con una arg de comandos, ya sea directamente o por dbl-clic en los nombres de archivo pasados ​​a argv [] son ​​ilegibles = en alguna mezcla de fuentes chinas.

Gracias por los comentarios - Voy a intentar y resúmenes (z) e ellos aquí para el motor de búsqueda.

  1. wmain(int argc,char **argv) sólo se puede utilizar para una línea de comandos (subsistema: consola) aplicación

  2. int winMain(int argc, wchar_t **argv) obras para una interfaz gráfica de usuario (subsistema: ventanas), pero la interfaz gráfica de usuario lo reemplaza con su propio punto de entrada. En el caso de Qt esto no funciona

    qtmaind.lib (qtmain_win.obj): LNK2019 de error: símbolo externo sin resolver _MAIN referencia en función de _WinMain @ 16

La solución parece ser el uso main(int arc,char **argv) o main(int argc,wchar_t**argv) pero ignore el argv. Luego llame a QApplication con argv o NULL: el argv se ignora cuando Qt llama internamente a GetCommandLine().
Luego use app.arguments para devolver los argumentos analizados.
Estos se pueden convertir de nuevo en wchar con las funciones de cadena de Qt si es necesario.

QApplication app(argc, (char**)argv); or QApplication app(argc,NULL); 
QStringList args = app.arguments(); 

Lo siento, no he marcado este Qt originalmente porque no creía que fuera relevante.
Si alguien quiere editar esto para incluir también cómo hacerlo en MFC, por favor.

+0

+1 ¡De este Googler! – knight666

Respuesta

15

debe asignar un nombre a su punto de entrada wmain: http://msdn.microsoft.com/en-us/library/fzc2cy7w(VS.80).aspx

+0

Parece que wmain solo se puede usar en la aplicación de línea de comandos, wWinMain es para GUI pero choca con la biblioteca de Qt. –

+0

@Martin, pensé que 'main' solo podía usarse para programas de línea de comando, así que no consideré que esto fuera un problema. –

+0

Desafortunadamente, se obtiene el nombre del archivo enviado como una línea de comando arg cuando hace doble clic, supongo que es realmente un error Qt. –

2

Prueba esto:

#include <tchar.h> 

int _tmain(int argc, TCHAR **argv) 
{ 
    return 0; 
} 

_tmain se define como wmain cuando se compila con la opción UNICODE y como main cuando se compila con la opción MBCS.

+3

Uh, no use las cosas MS 'T' a menos que necesite soportar Windows 9x mientras enlaza MFC dinámicamente (y no desea reconstruir MFC). Sin MFC en la imagen, y deseo apoyar Windows 9x para el programa Unicode, simplemente use Microsoft Layer para Unicode. De todos modos, usar 'T' cosas no es solo anacronismo, es una receta para problemas. :-) –

+1

@Alf, curioso por saber cómo las cosas' T' pueden meterlo en problemas Parece que el sistema de tipo rígido C++ te advertiría de cualquier desastre inminente. –

+2

@Mark: con las cosas 'T', p. los literales cambian de angostos a anchos, dependiendo de si ciertos macromos se definen al compilar. Normalmente, el código solo se prueba con un conjunto de definiciones de macro, p. construyendo como Unicode. Construir como ANSI (y la posibilidad de eso fue todo el punto de las cosas 'T') luego falla. Incluso si no falla, es más trabajo de prueba (aproximadamente el doble, probar dos versiones diferentes), y es más trabajo escribir el código. Eso también puede ponerte en problemas ... :-) Cheers & hth., –

4

Puede usar la función GetCommandLine para tal fin.

+2

Y también 'CommandLineToArgvW()' para analizar esa cadena devuelta en una matriz 'wchar_t []' de estilo argv. –

Cuestiones relacionadas