Qué hacer cuando a Visual C++ se le va la pinza en el editor de diálogos

Supongo que le habrá pasado a más de uno, que está haciendo cosas en el editor de diálogos de Visual C++ y de repente se le va la pinza y deja de funcionar como debe, a veces dando un error que no es un error.

Esto normalmente se debe a que hay algo mal en el código fuente que impide al parser actuar debidamente. Quizás hemos añadido una entrada mal en el mapa de mensajes, o en el DDX o simplemente el fichero de recursos esté mal.

Pero otras veces simplemente pasa, como ahora mismo. En este caso concreto ha sido añadiendo una variable para un control: he introducido el nombre (un nombre correcto) y me ha dicho que la sintaxis estaba mal (ejem) y a partir de ese momento la opción de añadir variable se ha ido de vacaciones…

La solución habitual es llamar a “Build -> Clean Solution”, pero eso tampoco termina de funcionar, así que a veces tenemos que pasar por hacerlo todo a mano…

Pues bien, en este caso concreto, cerramos Visual Studio, nos vamos a la carpeta del proyecto insultante y borramos el fichero de proyecto con la extensión del nombre de red de nuestra máquina (no el .vcproj, si borramos ese la cagamos a base de bien, sino el .vcproj.<host>), y el fichero .aps. A partir de ese momento todo debería volver a funcionar bien. También podríamos, ya de paso, borrar la carpeta DEBUG tanto de la del proyecto como de la solución, así como el .NCB y el .SUO de la solución, pero no es necesario.

Conversión ANSI a Unicode y viceversa

Seguro que no es la primera vez que te pasa que te dejan una serie de rutinas (generalmente en formato DLL) que reciben cadenas en formato ANSI y tu aplicación está escrita en Unicode, y cuando preguntas si tienen versión Unicode te responden que no y que no la van a tener… Y como no quiero perder mi empleo, voy a parar aquí.

Pues bien, existe una forma muy sencilla de pasar cadenas entre ambos formatos sin tener que liarnos con las funciones de conversión de Win32, que no son precisamente fáciles de manejar. Y como esto va a modo de receta, no entro en más detalles.

Lo primero es incluir atlconv.h en aquella unidad de compilación en donde vayamos a hacer conversiones.

Lo segundo es colocar la macro USES_CONVERSION; dentro del método en el que vamos a realizar las conversiones.

Lo tercero es declarar un puntero ANSI o Unicode dependiendo de si queremos pasar de un lado a otro.

Y finalmente usar la macro adecuada. Veámoslo con un ejemplo:

#include <atlconv.h>

Void FuncionQueNecesitaPasarDeANSIaUnicode(void)
{
    USES_CONVERSION; //ANSI 2 UNICODE macros

    char szCad[MAX_PATH];
    LPWSTR szCadUnicode;
    FuncionQueNecesitaANSIporqueNoTieneUNICODE(szCad);
    szCadUnicode=A2W((LPCSTR)szCad);

    CString printCad;
    printCad.Format(_T("ATPC: %s"),szCadUnicode);
    AddLogString(printCad);
}

Hay una espuerta de macros con el formato

[C]<origen>2[C]<destino>[EX]();

Origen y destino pueden ser A para ANSI,
W para Unicode, T para cuando estamos generando código agnóstico en cuanto al
formato de cadena, y OLE para cadenas OLE. C se usa para cuando es una cadena
constante.

De este modo, A2W convertirá de ANSI a
Unicode, y W2A al revés. Aquí la
referencia completa.