Errores de compilación de MFC debido a #defines de la plataforma Windows. Luchando por diagnosticar la razón.

programación


Estoy usando la última versión de Visual Studio 2022 / C++ / MFC, Windows SDK 10.0, conjunto de herramientas de plataforma 10.0 (última versión instalada), estándar de lenguaje C++ ISO C++ 17 estándar y compilación de 64 bits.

Comencé con la plantilla MDI estándar, agregué algunas cosas (control de edición Scintilla, que requiere >= ISO C++ 17) y compilé exitosamente.

Ahora estoy integrando el código fuente existente de un desarrollo anterior (que se compila bajo ISO C++ 14, pero puede que esa no sea la explicación de lo que voy a describir).

Mi compilación ahora falla con los siguientes errores:

Error	C1189	#error:  CTaskDialog is not supported on Windows versions prior to Vista.	Visual SQL Studio	C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\atlmfc\include\afxtaskdialog.h	18		

… y

Error	C2664	'INT getaddrinfo(PCSTR,PCSTR,const ADDRINFOA *,PADDRINFOA *)': cannot convert argument 1 from 'LPCTSTR' to 'PCSTR'	Visual SQL Studio	C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\atlmfc\include\atlsocket.h	163		

Entonces, no en mi código. En ambos casos, existe una compilación condicional basada en la versión de Windows #define. Por ejemplo, para el primer error, el código es:

#if (NTDDI_VERSION < NTDDI_VISTA) // min Windows Vista required
#error CTaskDialog is not supported on Windows versions prior to Vista.
#endif

Mi interpretación de esto es que el compilador ve el valor de NTDDI_VERSION como menor que el valor de NTDDI_VISTA y, por lo tanto, genera el error.

PERO, solo estoy usando todos los valores predeterminados creados por la plantilla del proyecto para pch.h, framework.h y targetver.h, lo cual (si mi comprensión es correcta) equivale a

#include <SDKDDKVer.h>

.

Entonces, estoy rascándome la cabeza sobre la explicación o la cura para este problema. Definitivamente no estoy redefiniendo la versión de Windows #define en ningún otro lugar. Sin embargo, creo

NTDDI_VERSION

en realidad no está definido en el punto del archivo de encabezado donde se aplica la prueba de versión, porque esta edición (sacrilegio, lo sé) hace que la compilación se realice correctamente:

#undef NTDDI_VERSION
#define NTDDI_VERSION NTDDI_WIN10

#if (NTDDI_VERSION < NTDDI_VISTA) // min Windows Vista required
#error CTaskDialog is not supported on Windows versions prior to Vista.
#endif

Claramente, editar AfxTaskDialog.h no es una solución aceptable, por lo que estaría increíblemente agradecido por cualquier sugerencia sobre cómo diagnosticar/resolver este problema.

Resumen de las definiciones del marco/plataforma

pch.h – #incluye “framework.h” como primera línea.
framework.h – #incluye “targetver.h” como primera línea
targetver.h – #include como primera línea

Lo que he probado:

He #definido explícitamente NTDDI_VERSION en pch.h y/o framework.h y/o targetver.h. He obligado a NTDDI_VERSION a pasar la prueba #if (NTDDI_VERSION

Solución 1

Para resolver el primer problema en la configuración del compilador en la pestaña Avanzado de C/C++, elija “mostrar inclusiones” y se mostrará durante la compilación la secuencia de inclusión; de esta manera puede encontrar la NTDDI_VERSION definido en absoluto antes del archivo que le interesa, o tal vez no esté definido en alguna parte. También asegúrese de que SDKDDKVer.h se incluya primero; intente colocarlo primero en su archivo de encabezado precompilado (pch.h).
El segundo error proviene de que TCHAR se definió como el carácter UNICODE pero la función espera el CHAR. Cambie la configuración a MBCS en lugar de UNICODE (pestaña General en propiedades y seleccione el valor “Conjunto de caracteres”). Esto puede ayudar si no es su código; de lo contrario, puede descubrir el parámetro pasado en el código.

Espero que esto ayude.

Saludos,
Máxima.

コメント

タイトルとURLをコピーしました