Partager via


Conformité STRICTE

Un code source qui se compile correctement peut générer des messages d’erreur lorsque vous activez la vérification de type STRICT . Les sections suivantes décrivent les exigences minimales pour la compilation de votre code lorsque STRICT est activé. Des étapes supplémentaires sont recommandées, en particulier pour produire du code portable.

Exigences générales

L’exigence principale est que vous devez déclarer les types de handle et les pointeurs de fonction corrects au lieu de vous appuyer sur des types plus généraux. Vous ne pouvez pas utiliser un type de handle là où un autre est attendu. Cela signifie également que vous devrez peut-être modifier les déclarations de fonction et utiliser davantage de casts de type.

Pour de meilleurs résultats, le type 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. Il est recommandé de placer toutes les déclarations de fonction dans un fichier include, 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 du 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é ou non la vérification de type STRICT. 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 modifier le fichier d’en-tête pour utiliser les types HWND, HDC, HANDLE, etc., 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 ont peut-être changé et votre déclaration locale est 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 de plusieurs types, en fonction du contexte. Lorsque vous voyez l’une de ces fonctions dans votre code source, assurez-vous que vous utilisez le cast de type correct et qu’il est aussi spécifique que possible. La liste suivante est un exemple de ces fonctions.

Lorsque vous appelez SendMessage, DefWindowProc ou SendDlgItemMessage, vous devez d’abord convertir le résultat en type 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 correcte. 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 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 la vérification de type STRICT , 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, LRESULT et LPVOID sont des types de données polymorphes. Ils contiennent différents types de données à différents moments, même lorsque la vérification de type STRICT est activée. Pour tirer parti de la vérification de type, vous devez convertir les valeurs de ces types dès que possible. (Notez que les crackers de messages recastent automatiquement wParam et lParam pour vous de manière portable.)

Veillez particulièrement à distinguer les types HMODULE et 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 du noyau utilisent des types HINSTANCE , mais il existe quelques fonctions qui retournent ou acceptent uniquement les types HMODULE .

Désactivation de STRICT

Activation de STRICT