Convertir LPWSTR a char **

Iniciado por patilanz, 12 Agosto 2015, 11:22 AM

0 Miembros y 2 Visitantes están viendo este tema.

patilanz

Hola, se les ocurre mejor manera de convertir un LPWSTR a char **;
Código (cpp) [Seleccionar]
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

Eternal Idol

#1
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).

Código (c++) [Seleccionar]
...
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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

patilanz

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 ?

Eternal Idol

Y si, es una perdida de tiempo para el programa convertir cadenas. En la gama NT desde su primera version en 1993.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón