Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: patilanz en 12 Agosto 2015, 11:22 AM

Título: Convertir LPWSTR a char **
Publicado por: patilanz en 12 Agosto 2015, 11:22 AM
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
Título: Re: Convertir LPWSTR a char **
Publicado por: Eternal Idol en 12 Agosto 2015, 12:45 PM
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.
Título: Re: Convertir LPWSTR a char **
Publicado por: patilanz en 12 Agosto 2015, 13:11 PM
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 ?
Título: Re: Convertir LPWSTR a char **
Publicado por: Eternal Idol en 12 Agosto 2015, 14:10 PM
Y si, es una perdida de tiempo para el programa convertir cadenas. En la gama NT desde su primera version en 1993.