C/Visual C - Componentes COM: AfxMessageBox

 
Vista:

Componentes COM: AfxMessageBox

Publicado por Gorka (1 intervención) el 23/08/2002 12:09:29
Buenas!
Estoy intentando sacar un mensaje en mi PDA usando AfxMessageBox con el resultado de parsear la respuesta de una Web Sevice.
Tengo este código

[...]
hr = penv->Parse ( CComVariant(t), CComBSTR(L"") ) ;

CComPtr<ISOAPNodes> p ;
// get the parameters collection again, to get the response parameters
penv->get_Parameters(&p) ;
CComPtr<ISOAPNode> retNode ;

// get the first node in the parameters collection
p->get_Item(0, &retNode) ;

// get the nodes value
CComVariant v ;
retNode->get_Value(&v) ;

// change its type to a string
v.ChangeType(VT_BSTR) ;

AfxMessageBox((LPCTSTR)v.bstrVal) ;
[...]

El problema es que me saca el messageBox, pero en lugar de salir el resultado que yo espero, me saca caracteres extraños, estilo cuadrados , acentoscircunflejos, letras sueltas...

Me pasaba lo mismo al ejecutar esto:

AfxMessageBox((LPCTSTR)"Hello!");

y lo solucioné añadiendo una L antes del texto:

AfxMessageBox((LPCTSTR)L"Hello!");

Alguien sabe por qué pasa esto. Puede ser que no esté parseando bien la respuesta. La web service me da el resultado esperado, pero no se si se recoge bien.
Soy bastante novatillo en esto de componentes COM y en C++, asi que si alguien me puede echar una mano. Gracias a todos!.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Solución para caracteres extraños en AfxMessageBox

Publicado por Alejandro (913 intervenciones) el 14/03/2025 19:15:21
Gorka, el problema que estás experimentando con `AfxMessageBox` mostrando caracteres extraños se debe a la forma en que se manejan las cadenas de texto en C++. En tu caso, parece que el valor que estás obteniendo del servicio web no se está convirtiendo correctamente a un tipo de cadena que `AfxMessageBox` pueda manejar adecuadamente.

Aquí tienes una solución paso a paso:

1. Asegúrate de que el tipo de la variable `v` sea correcto: Cuando obtienes el valor del nodo, asegúrate de que realmente sea un `BSTR` y que esté correctamente inicializado.

2. Usa `CComBSTR` para manejar el `BSTR`: En lugar de convertir directamente `v.bstrVal` a `LPCTSTR`, puedes usar `CComBSTR` para asegurarte de que la conversión se maneje correctamente. Aquí tienes un ejemplo de cómo hacerlo:

1
2
3
4
5
6
7
CComBSTR bstrValue;
retNode->get_Value(&v);
v.ChangeType(VT_BSTR);
bstrValue = v.bstrVal; // Asigna el valor a un CComBSTR
 
// Muestra el mensaje usando AfxMessageBox
AfxMessageBox(bstrValue); // AfxMessageBox acepta BSTR directamente

3. Verifica la codificación: Asegúrate de que la respuesta del servicio web esté en la codificación correcta (UTF-8, UTF-16, etc.) y que tu aplicación esté configurada para manejar esa codificación. Si la respuesta está en UTF-8, necesitarás convertirla a UTF-16 antes de mostrarla.

4. Depuración: Si sigues teniendo problemas, puedes depurar el valor de `v` antes de mostrarlo en el `AfxMessageBox`. Imprime el valor en la consola o en un archivo de registro para verificar que realmente contiene lo que esperas.

Siguiendo estos pasos, deberías poder resolver el problema de los caracteres extraños en el mensaje. Si el problema persiste, revisa la forma en que se está parseando la respuesta del servicio web para asegurarte de que se está manejando correctamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar