Erreurs de compilation MFC dues à la plate-forme Windows #defines. J’ai du mal à diagnostiquer la raison.

la programmation


J’utilise la dernière version de Visual Studio 2022 / C++ / MFC, le SDK Windows 10.0, le jeu d’outils de plate-forme 10.0 (dernière version installée), la norme de langage C++ ISO C++ 17 et la construction 64 bits.

J’ai commencé avec le modèle MDI standard, ajouté quelques éléments (contrôle d’édition Scintilla, qui nécessite >= ISO C++ 17) et compilé avec succès.

Maintenant, j’intègre le code source existant du développement précédent (qui compile sous ISO C++ 14, mais ce n’est peut-être pas l’explication de ce que je m’apprête à décrire).

Ma compilation échoue maintenant avec les erreurs suivantes :

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		

… et

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		

Donc, pas dans mon code. Dans les deux cas, il existe une compilation conditionnelle basée sur la version Windows #defines. Par exemple, pour la première erreur, le code est :

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

Mon interprétation de ceci est que le compilateur considère la valeur de NTDDI_VERSION comme inférieure à la valeur de NTDDI_VISTA et déclenche donc l’erreur.

MAIS, j’utilise uniquement toutes les valeurs par défaut créées par le modèle de projet pour pch.h, framework.h et targetver.h, ce qui (si j’ai bien compris) équivaut à

#include <SDKDDKVer.h>

.

Donc, je me demande l’explication ou le remède à ce problème. Je ne redéfinis certainement pas la version de Windows #defines ailleurs. Cependant, je pense

NTDDI_VERSION

n’est en fait pas défini au point du fichier d’en-tête où le test de version est appliqué, car cette modification (sacrilège, je sais) entraîne le succès de la compilation :

#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

Il est clair que modifier AfxTaskDialog.h n’est pas une solution acceptable, je serais donc extrêmement reconnaissant pour toute suggestion sur la façon de diagnostiquer/résoudre ce problème.

Résumé des définitions du framework/de la plateforme

pch.h – #include “framework.h” comme première ligne.
framework.h – #include “targetver.h” comme première ligne
targetver.h – #include comme première ligne

Ce que j’ai essayé :

J’ai explicitement #défini NTDDI_VERSION dans pch.h et/ou framework.h et/ou targetver.h. J’ai forcé NTDDI_VERSION à réussir le test #if (NTDDI_VERSION < NTDDI_VISTA) en codant en dur NTDDI_VERSION (qui fonctionne mais n'est pas une solution viable).

Solution 1

Pour comprendre le premier problème sous les paramètres du compilateur dans l’onglet Avancé de C/C++, choisissez “afficher les inclusions” et il affichera pendant la construction la séquence d’inclusions – de cette façon, vous pouvez trouver le NTDDI_VERSION défini du tout avant le fichier qui vous intéresse, ou il peut être indéfini quelque part. Assurez-vous également que SDKDDKVer.h est inclus en premier – essayez de le mettre en premier dans votre fichier d’en-tête précompilé (pch.h)
La deuxième erreur vient du fait que TCHAR est défini comme le caractère UNICODE mais que la fonction attend le CHAR. Modifiez les paramètres en MBCS au lieu d’UNICODE (onglet Général dans les propriétés et sélectionnez la valeur “Jeu de caractères”) – cela peut aider si ce n’est pas votre code, sinon vous pouvez comprendre le paramètre transmis dans le code.

J’espère que cette aide.

Salutations,
Maxime.

コメント

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