Hilo
Curso WINAPI. DialogBox con texto. (marcelinux) 2017-10-18 12:42:11
Hola. Estoy en http://winapi.conclase.net/curso/index.php?cap=007b#inicio
Tengo alguna dificultad con el valor inicial.
Aparte del warning de aviso de la "inseguridad" de strcpy, al compilar me muestra el siguiente error:
error C2664: 'SetDlgItemTextW' : no se puede convertir el parámetro 3 de 'char [80]' a 'LPCWSTR'
Los tipos señalados no están relacionados; la conversión requiere reinterpret_cast, conversión de estilo de C o conversión de estilo de función
Utilizo VisualStudio 2008.
Si cambio:
SetDlgItemText(hDlg, ID_TEXTO, Datos-> Texto);
por:
SetDlgItemTextW(hDlg, ID_TEXTO, reinterpret_cast<LPWSTR> (&Datos->Texto));
El control EDIT no me muestra "Inicial" como valor. En su lugar me muestra el símbolo "pipe".
Por Debug, veo que Datos-> Texto contiene "Inicial" pero con dos "bytes" por carácter.
Sin embargo, usando reinterpret_cast, tras GetDlgItemText(hDlg, ID_TEXTO, reinterpret_cast<LPWSTR> (&Datos->Texto), 80);
el valor del control es correcto.
¿Alguna pista para asignar el valor inicial?
Gracias.
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Curso WINAPI. DialogBox con texto. (Steven Davidson) 2017-10-18 17:13:59
Hola Marcelinux,
Estás mezclando ASCII (CHAR o char) con Unicode (WCHAR o wchar_t). Hoy por
hoy, deberías usar Unicode, por lo que aconsejo que cambies la
representación del miembro, 'Texto'. Esto es,
typedef struct stDatos {
WCHAR Texto[80]; // equivale a: wchar_t Texto[80]
} DATOS;
Esto implica que tendrás que usar otras funciones para manipular cadenas de
caracteres de tipo 'wchar_t'; por ejemplo, usa 'wcscpy()'
Por último y para aclarar, las invocaciones que hiciste no son correctas.
Escribiste:
reinterpret_cast<LPWSTR> (&Datos->Texto)
El tipo del miembro, 'Texto', ya es un puntero, por lo que obtendrías un
doble puntero; sin embargo, esto no es lo que quieres. Gramaticalmente, la
expresión correcta debería ser:
reinterpret_cast<LPWSTR> (Datos->Texto)
Claro está, esto no es correcto en este caso, porque la representación de
caracteres usando 'char' es diferente que la de 'wchar_t'.
Espero que esto aclare las dudas.
Steven
2017-10-18 8:42 GMT-04:00 marcelinux <marcelinator@gmail.com>:
> Hola. Estoy en http://winapi.conclase.net/curso/index.php?cap=007b#inicio
> Tengo alguna dificultad con el valor inicial.
> Aparte del warning de aviso de la "inseguridad" de strcpy, al compilar me
> muestra el siguiente error:
> error C2664: 'SetDlgItemTextW' : no se puede convertir el parámetro 3 de
> 'char [80]' a 'LPCWSTR'
> Los tipos señalados no están relacionados; la conversión requiere
> reinterpret_cast, conversión de estilo de C o conversión de estilo de
> función
>
> Utilizo VisualStudio 2008.
> Si cambio:
> SetDlgItemText(hDlg, ID_TEXTO, Datos-> Texto);
> por:
> SetDlgItemTextW(hDlg, ID_TEXTO, reinterpret_cast<LPWSTR> (&Datos->Texto));
> El control EDIT no me muestra "Inicial" como valor. En su lugar me muestra
> el símbolo "pipe".
> Por Debug, veo que Datos-> Texto contiene "Inicial" pero con dos "bytes"
> por carácter.
> Sin embargo, usando reinterpret_cast, tras GetDlgItemText(hDlg, ID_TEXTO,
> reinterpret_cast<LPWSTR> (&Datos->Texto), 80);
> el valor del control es correcto.
> ¿Alguna pista para asignar el valor inicial?
> Gracias.
>
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Curso WINAPI. DialogBox con texto. (marcelinux) 2017-10-19 08:13:13
El pasado 2017-10-18 17:13:59, Steven Davidson escribió:
SD> Estás mezclando ASCII (CHAR o char) con Unicode (WCHAR o wchar_t). Hoy por
SD> hoy, deberías usar Unicode, por lo que aconsejo que cambies la
SD> representación del miembro, 'Texto'. Esto es,
SD> typedef struct stDatos {
SD> WCHAR Texto[80]; // equivale a: wchar_t Texto[80]
SD> } DATOS;
SD> Esto implica que tendrás que usar otras funciones para manipular cadenas de
SD> caracteres de tipo 'wchar_t'; por ejemplo, usa 'wcscpy()'
Perfecto. Esto lo resuelve. Gracias.
SD> Por último y para aclarar, las invocaciones que hiciste no son correctas.
SD> Escribiste:
SD> reinterpret_cast<LPWSTR> (&Datos->Texto)
SD> El tipo del miembro, 'Texto', ya es un puntero, por lo que obtendrías un
SD> doble puntero; sin embargo, esto no es lo que quieres. Gramaticalmente, la
SD> expresión correcta debería ser:
SD> reinterpret_cast<LPWSTR> (Datos->Texto)
SD> Claro está, esto no es correcto en este caso, porque la representación de
SD> caracteres usando 'char' es diferente que la de 'wchar_t'.
SD> Espero que esto aclare las dudas.
OK. Muchas gracias por la aclaración. Es que estuve "probando" diferentes alternativas y la última prueba fue ésta.
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ