Conformité STRICTE
Un code source compilé peut générer des messages d’erreur lorsque vous activez STRICT vérification de type. Les sections suivantes décrivent les conditions minimales requises pour compiler votre code lorsque STRICT est activée. Des étapes supplémentaires sont recommandées, en particulier pour produire du code portable.
Conditions générales
L’exigence principale est que vous devez déclarer des types de handle et des pointeurs de fonction corrects au lieu de s’appuyer sur des types plus généraux. Vous ne pouvez pas utiliser un type de handle où un autre est attendu. Cela signifie également que vous devrez peut-être modifier les déclarations de fonction et utiliser d’autres casts de type.
Pour obtenir de meilleurs résultats, le type de HANDLE générique doit être utilisé uniquement si nécessaire.
Déclaration de fonctions dans votre application
Vérifiez que toutes les fonctions d’application sont déclarées. Le placement de toutes les déclarations de fonction dans un fichier include est recommandé, car vous pouvez facilement analyser vos déclarations et rechercher les types de paramètres et de retour qui doivent être modifiés.
Si vous utilisez l’option de compilateur /Zg pour créer des fichiers d’en-tête pour vos fonctions, n’oubliez pas que vous obtiendrez des résultats différents selon que vous avez activé STRICT vérification de type. Avec STRICT désactivé, tous les types de handle génèrent le même type de base. Avec STRICT activé, ils génèrent différents types de base. Pour éviter les conflits, vous devez recréer le fichier d’en-tête chaque fois que vous activez ou désactivez STRICT, ou modifiez le fichier d’en-tête pour utiliser les types HWND , HDC, HANDLE, et ainsi de suite, au lieu des types de base.
Toutes les déclarations de fonction que vous avez copiées à partir de Windows.h dans votre code source peuvent avoir changé et votre déclaration locale peut être obsolète. Supprimez votre déclaration locale.
Types qui nécessitent des casts
Certaines fonctions ont des types de retour ou des paramètres génériques. Par exemple, la fonction SendMessage retourne des données qui peuvent être n’importe quel nombre de types, en fonction du contexte. Lorsque vous voyez l’une de ces fonctions dans votre code source, assurez-vous d’utiliser le cast de type correct et qu’elle est aussi spécifique que possible. La liste suivante est un exemple de ces fonctions.
Lorsque vous appelez SendMessage, DefWindowProcou SendDlgItemMessage, vous devez d’abord convertir le résultat en UINT_PTR. Vous devez effectuer des étapes similaires pour toute fonction qui retourne une valeur LRESULT ou LONG_PTR, où le résultat contient un handle. Cela est nécessaire pour écrire du code portable, car la taille d’un handle varie en fonction de la version de Windows. Le cast (UINT_PTR) garantit une conversion appropriée. Le code suivant montre un exemple dans lequel sendMessage retourne un handle à un pinceau :
HBRUSH hbr;
hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);
Le paramètre CreateWindow et paramètre CreateWindowExhmenu est parfois utilisé pour passer un identificateur de contrôle entier (ID). Dans ce cas, vous devez convertir l’ID en type HMENU :
HWND hwnd;
int id;
hwnd = CreateWindow(
TEXT("Button"), TEXT("OK"), BS_PUSHBUTTON,
x, y, cx, cy, hwndParent,
(HMENU)id, // Cast required here
hinst,
NULL);
Considérations supplémentaires
Pour tirer le meilleur parti de STRICT vérification de type, vous devez suivre des instructions supplémentaires. Votre code sera plus portable dans les futures versions de Windows si vous apportez les modifications suivantes.
Les types WPARAM, LPARAM, LRESULTet LPVOID sont types de données polymorphes. Ils contiennent différents types de données à différents moments, même quand STRICT vérification de type est activée. Pour bénéficier de la vérification de type, vous devez convertir les valeurs de ces types dès que possible. (Notez que les craqueurs de messages recréent automatiquement wParam et lParam pour vous de manière portable.)
Veillez à distinguer HMODULE et types HINSTANCE. Même avec STRICT activé, ils sont définis comme le même type de base. La plupart des fonctions de gestion des modules de noyau utilisent types HINSTANCE, mais il existe quelques fonctions qui retournent ou acceptent uniquement types HMODULE.
Rubriques connexes