lhj7362
En primer lugar, ¿qué es exactamente? Supongo que es un puntero (LPC significa constante de puntero largo), pero ¿qué significa “W”? ¿Es un puntero específico a una cadena o un puntero a una cadena específica? Por ejemplo, quiero cerrar una ventana llamada “TestWindow”.
HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);
El código es ilegal y no funciona desde const char[6] no se puede convertir a CONST WCHAR. No lo entiendo en absoluto. Quiero obtener una comprensión clara de todos estos LPCWSTR, LPCSTR, LPSTR. Traté de encontrar algo, sin embargo, me confundí aún más. En el sitio msdn FindWindowEx
se declara como
HWND FindWindowEx(
HWND hwndParent,
HWND hwndChildAfter,
LPCTSTR lpszClass,
LPCTSTR lpszWindow
);
Entonces, el último parámetro es LPCSTR, y el compilador exige LPCWSTR. Por favor ayuda.
LPCWSTR
significa “Puntero largo a cadena ancha constante”. La W significa ancho y significa que la cadena se almacena en un carácter de 2 bytes frente al normal char
. Común para cualquier código C/C++ que tenga que lidiar solo con cadenas que no sean ASCII.=
Para obtener una cadena literal C normal para asignar a un LPCWSTR
necesitas prefijarlo con L
LPCWSTR a = L"TestWindow";
-
Solo para expandir: la parte ‘LARGA’ es una resaca de las ventanas de 16 bits y se puede ignorar (excepto que la necesita en el nombre)
– Martín Beckett
9 de febrero de 2010 a las 16:51
-
“resaca de Windows de 16 bits” — ¡Eso es seguro!
– John Dibling
9 de febrero de 2010 a las 17:05
-
No, es correcto. Era y es un puntero de 32 bits. Ya no hay punteros “cortos” de 16 bits, por lo que puede quejarse si logra encontrar un
SPCWSTR
.– MSalters
10 de febrero de 2010 a las 10:44
-
Dios mío. L??? ¿La letra L? Ni siquiera una función, L()? ¿Simplemente L? A quien diablos se le ocurrio eso??
– John Ktejik
6 de enero de 2013 a las 23:02
-
@user396483 Es común en muchos idiomas agregar prefijos y sufijos a las constantes para cambiar la forma en que se representan, sin cambiar su significado para un ser humano. Por ejemplo,
36UL
en C# es lo mismo que(ulong)36
(ulong es un entero de 64 bits sin signo).@
se puede usar en el mismo idioma como prefijo para cadenas, cambiando ligeramente la forma en que se analizan.– Zenexer
19 de julio de 2013 a las 13:58
LPCWSTR
es equivalente a wchar_t const *
. Es un puntero a una cadena de caracteres ancha que no será modificada por la llamada a la función.
Puede asignar a LPCWSTR
s anteponiendo una L a un literal de cadena: LPCWSTR *myStr = L"Hello World";
LPCTSTR y cualquier otro T tipos, tome un tipo de cadena dependiendo de la configuración de Unicode para su proyecto. Si _UNICODE
está definido para su proyecto, el uso de tipos T es el mismo que el de los formularios de caracteres anchos, de lo contrario, los formularios Ansi. La función apropiada también se llamará de esta manera: FindWindowEx
Se define como FindWindowExA
o FindWindowExW
dependiendo de esta definición.
-
¿Cómo verifico si estoy usando la configuración Unicode correcta en una instalación nueva de VS y en un proyecto de aplicación de consola nuevo? Mis caracteres farsi se muestran como ‘?’ signos de interrogación a pesar de que el problema no proviene del símbolo del sistema, otras aplicaciones imprimen caracteres Farsi muy bien.
– Shayán
6 de mayo a las 8:54
Es un puntero largo a una cadena ancha y constante (es decir, una cadena de caracteres anchos).
Dado que es una cadena ancha, desea que su constante se vea así: L"TestWindow"
. Yo no crearía el intermedio a
tampoco, simplemente pasaría L"TestWindow"
para el parámetro:
ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");
Si quiere ser pedantemente correcto, un “LPCTSTR” es una cadena de “texto”, una cadena ancha en una compilación Unicode y una cadena estrecha en una compilación ANSI, por lo que debe usar la macro adecuada:
ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));
Sin embargo, pocas personas se preocupan por producir código que pueda compilar tanto para conjuntos de caracteres Unicode como ANSI, y si no logras que funcione correctamente, puede ser un poco de trabajo adicional por una pequeña ganancia. En este caso particular, no hay mucho trabajo adicional, pero si está manipulando cadenas, hay un conjunto completo de macros de manipulación de cadenas que resuelven las funciones correctas.
-
no necesita ser pedantemente correcto, use _T() si está usando constantes como _T(MAIN_WINDOW) de lo contrario, LMAIN_WINDOW fallará.
– Rodolfo
13 de noviembre de 2012 a las 22:56
Bienvenido a la notación húngara de Microsoft.
– Thomas Matthews
9 de febrero de 2010 a las 17:33
en realidad hace que la documentación sea mucho más legible, lástima por todo lo demás, sux.
– Matt Carpintero
9 de febrero de 2010 a las 17:39
@Thomas: Esto es no lo que Microsoft (o Simonyi para el caso) etiquetó inicialmente Notación húngara. Es más o menos el resultado de un accidente, cuando el grupo de documentación decidió realizar algunas mejoras de “legibilidad”. No eran desarrolladores y, en consecuencia, los cambios no fueron elegantes. La información de antecedentes está disponible en Notación húngara: ahora es mi turno 🙂
– Inspeccionable
21/10/2014 a las 18:48
@IInspectable: enlace roto
– Nicolás Raoul
4 de marzo de 2016 a las 7:33
@IInspectable: el enlace de trabajo es blogs.msdn.microsoft.com/larryosterman/2004/06/22/…
– Julio Bullinger
8 de agosto de 2016 a las 13:07