Hola, se les ocurre mejor manera de convertir un LPWSTR a char **;
int argc;
LPWSTR *_argv = CommandLineToArgvW(GetCommandLineW(), &argc);
char ** argv = new char*[argc * 200];
for (int i = 0; i < argc; i++){
argv[i] = new char[200];
wcstombs(argv[i], _argv[i], 200);
}
for (int i = 0; i < argc; i++){
delete [] argv[i];
}
delete[] argv;
Un saludo
En la linea 3 estas reservando punteros y no deberias reservar 200 veces mas de los estrictamente necesarios. Y ya que estamos CommandLineToArgvW puede fallar.
If wcstombs encounters the wide-character null character (L'\0') either before or when count occurs, it converts it to an 8-bit 0 and stops. Thus, the multibyte character string at mbstr is null-terminated only if wcstombs encounters a wide-character null character during conversion.
Eso quiere decir que si por una de esas casualidades a alguien se le ocurre pasar un parametro de 200 caracteres o mas (un path por ejemplo) tu cadena no tendra cero terminador. Mejor poner todos los elementos del array a 0 con el inicializador new () - nada nos garantiza los valores en la memoria reservada de otra manera - y pasar como count a wcstombs un caracter menos de los reservado (sino puede escribir en ese ultimo).
...
if (LPWSTR *_argv = CommandLineToArgvW(GetCommandLineW(), &argc))
{
char ** argv = new char*[argc];
...
argv[i] = new char[200]();
wcstombs(argv[i], _argv[i], 199);
...
Lo mejor que se me ocurre es no hacerlo, Windows trabaja internamente con Unicode y practicamente cada vez que llamas a una API A (ANSI) tiene que hacer la conversion a Unicode y despues llamar a la API W.
Gracias, código mejorado.
Lo hago porque no quiero poner cada vez L delante de un string porque me gusta utilizar multibyte.
Si windows trabaja internamente con Unicode si utilizo la API W optimizo mi programa ?
Desde que versión de Windows se utiliza Unicode de forma interna, o desde siempre ?
Y si, es una perdida de tiempo para el programa convertir cadenas. En la gama NT desde su primera version en 1993.