elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Convertir LPWSTR a char **
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Convertir LPWSTR a char **  (Leído 2,114 veces)
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Convertir LPWSTR a char **
« en: 12 Agosto 2015, 11:22 am »

Hola, se les ocurre mejor manera de convertir un LPWSTR a char **;
Código
  1. int argc;
  2. LPWSTR *_argv = CommandLineToArgvW(GetCommandLineW(), &argc);
  3. char ** argv = new char*[argc * 200];
  4. for (int i = 0; i < argc; i++){
  5. argv[i] = new char[200];
  6. wcstombs(argv[i], _argv[i], 200);
  7. }
  8.  
  9.  
  10.  
  11. for (int i = 0; i < argc; i++){
  12. delete [] argv[i];
  13. }
  14. delete[] argv;

Un saludo


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.959


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Convertir LPWSTR a char **
« Respuesta #1 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
  1. ...
  2. if (LPWSTR *_argv = CommandLineToArgvW(GetCommandLineW(), &argc))
  3. {
  4.    char ** argv = new char*[argc];
  5. ...
  6.        argv[i] = new char[200]();
  7. wcstombs(argv[i], _argv[i], 199);
  8. ...

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.


« Última modificación: 12 Agosto 2015, 13:06 pm por Eternal Idol » En línea

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


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Convertir LPWSTR a char **
« Respuesta #2 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 ?
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.959


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Convertir LPWSTR a char **
« Respuesta #3 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.
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
convertir char a wchar_t
Programación C/C++
Riki_89D 3 5,166 Último mensaje 1 Junio 2010, 09:27 am
por Eternal Idol
Convertir char ** en double
Programación C/C++
karmele85 5 3,670 Último mensaje 6 Julio 2010, 20:35 pm
por karmele85
Convertir char[] a char *[] ?
Programación C/C++
Sanlegas 2 4,961 Último mensaje 11 Julio 2010, 01:01 am
por leogtz
convertir unsigned char a char
Programación C/C++
SARGE553413 4 3,489 Último mensaje 10 Julio 2014, 13:28 pm
por SARGE553413
Duda pasar de LPWSTR a char * « 1 2 »
Programación C/C++
Kaxperday 15 5,907 Último mensaje 13 Noviembre 2014, 16:10 pm
por someRandomCode
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines