Versions de contrôle courantes

Cette rubrique répertorie les versions disponibles de la bibliothèque common control (ComCtl32.dll), explique comment identifier la version utilisée par votre application et explique comment cibler votre application pour une version spécifique.

Cette rubrique contient les sections suivantes.

Numéros de versions de DLL de contrôle commun

La prise en charge des contrôles communs est assurée par ComCtl32.dll, que toutes les versions 32 bits et 64 bits de Windows incluent. Chaque version successive de la DLL prend en charge les fonctionnalités et l’API des versions antérieures, et ajoute de nouvelles fonctionnalités.

Étant donné que différentes versions de ComCtl32.dll ont été distribuées avec internet Explorer, la version active est parfois différente de la version fournie avec le système d’exploitation. Par conséquent, votre application doit déterminer directement quelle version de ComCtl32.dll est présente.

Dans la documentation de référence sur les contrôles courants, de nombreux éléments de programmation spécifient un numéro de version DE DLL minimum pris en charge. Ce numéro de version indique que l’élément de programmation est implémenté dans cette version et les versions ultérieures de la DLL, sauf indication contraire. Si aucun numéro de version n’est spécifié, l’élément de programmation est implémenté dans toutes les versions existantes de la DLL.

Le tableau suivant décrit les différentes versions de DLL et la façon dont elles ont été distribuées sur les systèmes d’exploitation pris en charge.

ComCtl32.dll

Version

Plateforme de distribution

5.81

Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 et Microsoft Internet Explorer 6

5.82

Windows Server 2003, Windows Vista, Windows Server 2008 et Windows 7

6.0

Windows Server 2003

6.10

Windows Vista, Windows Server 2008 et Windows 7

 

Tailles de structure pour différentes versions de contrôle courantes

Les améliorations continues apportées aux contrôles communs ont entraîné la nécessité d’étendre un grand nombre de structures. Pour cette raison, la taille des structures a changé entre les différentes versions de Commctrl.h. Étant donné que la plupart des structures de contrôle courantes prennent une taille de structure comme l’un des paramètres, un message ou une fonction peut échouer si la taille n’est pas reconnue. Pour remédier à ce problème, des constantes de taille de structure ont été définies pour faciliter le ciblage de différentes versions de ComCtl32.dll. La liste suivante définit les constantes de taille de structure.

Constante de taille de structure Définition
HDITEM_V1_SIZE Taille de la structure HDITEM dans la version 4.0.
IMAGELISTDRAWPARAMS_V3_SIZE Taille de la structure IMAGELISTDRAWPARAMS dans la version 5.9.
LVCOLUMN_V1_SIZE Taille de la structure LVCOLUMN dans la version 4.0.
LVGROUP_V5_SIZE Taille de la structure LVGROUP dans la version 6.0.
LVHITTESTINFO_V1_SIZE Taille de la structure LVHITTESTINFO dans la version 4.0.
LVITEM_V1_SIZE Taille de la structure LVITEM dans la version 4.0.
LVITEM_V5_SIZE Taille de la structure LVITEM dans la version 6.0.
LVTILEINFO_V5_SIZE Taille de la structure LVTILEINFO dans la version 6.0.
MCHITTESTINFO_V1_SIZE Taille de la structure MCHITTESTINFO dans la version 4.0.
NMLVCUSTOMDRAW_V3_SIZE Taille de la structure NMLVCUSTOMDRAW dans la version 4.7.
NMTTDISPINFO_V1_SIZE Taille de la structure NMTTDISPINFO dans la version 4.0.
NMTVCUSTOMDRAW_V3_SIZE Taille de la structure NMTVCUSTOMDRAW dans la version 4.7.
PROPSHEETHEADER_V1_SIZE Taille de la structure PROPSHEETHEADER dans la version 4.0.
PROPSHEETPAGE_V1_SIZE Taille de la structure PROPSHEETPAGE dans la version 4.0.
REBARBANDINFO_V3_SIZE Taille de la structure REBARBANDINFO dans la version 4.7.
REBARBANDINFO_V6_SIZE Taille de la structure REBARBANDINFO dans la version 6.0.
TTTOOLINFO_V1_SIZE Taille de la structure TOOLINFO dans la version 4.0.
TTTOOLINFO_V2_SIZE Taille de la structure TOOLINFO dans la version 4.7.
TTTOOLINFO_V3_SIZE Taille de la structure TOOLINFO dans la version 6.0.
TVINSERTSTRUCT_V1_SIZE Taille de la structure TVINSERTSTRUCT dans la version 4.0.

 

Utilisation de DllGetVersion pour déterminer le numéro de version

La fonction DllGetVersion peut être appelée par une application pour déterminer quelle version de DLL est présente sur le système.

DllGetVersion retourne une structure DLLVERSIONINFO2 . En plus des informations fournies via DLLVERSIONINFO, DLLVERSIONINFO2 fournit également le numéro de correctif logiciel qui identifie le dernier Service Pack installé, ce qui offre un moyen plus robuste de comparer les numéros de version. Étant donné que le premier membre de DLLVERSIONINFO2 est une structure DLLVERSIONINFO , la structure ultérieure est à compatibilité descendante.

L’exemple de fonction GetVersion suivant charge une DLL spécifiée et tente d’appeler sa fonction DllGetVersion . En cas de réussite, il utilise une macro pour empaqueter les numéros de version principale et secondaire de la structure DLLVERSIONINFO dans un DWORD qui est retourné à l’application appelante. Si la DLL n’exporte pas DllGetVersion, la fonction retourne zéro. Vous pouvez modifier la fonction pour gérer la possibilité que DllGetVersion retourne une structure DLLVERSIONINFO2 . Si c’est le cas, utilisez les informations contenues dans le membre ullVersion de cette structure DLLVERSIONINFO2 pour comparer les versions, les numéros de build et les versions de Service Pack. La macro MAKEDLLVERULL simplifie la comparaison de ces valeurs à celles de ullVersion.

Notes

L’utilisation incorrecte de LoadLibrary peut poser des risques de sécurité. Reportez-vous à la documentation LoadLibrary pour plus d’informations sur le chargement correct des DLL avec différentes versions de Windows.

 

#include "stdafx.h"
#include "windows.h"
#include "windef.h"
#include "winbase.h"
#include "shlwapi.h"

#define PACKVERSION(major,minor) MAKELONG(minor,major)

DWORD GetVersion(LPCTSTR lpszDllName)
{
    HINSTANCE hinstDll;
    DWORD dwVersion = 0;

    // For security purposes, LoadLibrary should be provided with a fully qualified 
    // path to the DLL. The lpszDllName variable should be tested to ensure that it 
    // is a fully qualified path before it is used. 
    hinstDll = LoadLibrary(lpszDllName);
    
    if(hinstDll)
    {
        DLLGETVERSIONPROC pDllGetVersion;
        pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hinstDll, "DllGetVersion");

        // Because some DLLs might not implement this function, you must test for 
        // it explicitly. Depending on the particular DLL, the lack of a DllGetVersion 
        // function can be a useful indicator of the version. 

        if(pDllGetVersion)
        {
            DLLVERSIONINFO dvi;
            HRESULT hr;

            ZeroMemory(&dvi, sizeof(dvi));
            dvi.info1.cbSize = sizeof(dvi);

            hr = (*pDllGetVersion)(&dvi);

            if(SUCCEEDED(hr))
            {
               dwVersion = PACKVERSION(dvi.info1.dwMajorVersion, dvi.info1.dwMinorVersion);
            }
        }
        FreeLibrary(hinstDll);
    }
    return dwVersion;
}

L’exemple de code suivant montre comment vous pouvez utiliser GetVersion pour tester si ComCtl32.dll est version 6.0 ou ultérieure.

LPCTSTR lpszDllName = L"C:\\Windows\\System32\\ComCtl32.dll";
DWORD dwVer = GetVersion(lpszDllName);
DWORD dwTarget = PACKVERSION(6,0);

if(dwVer >= dwTarget)
{
    // This version of ComCtl32.dll is version 6.0 or later.
}
else
{
    // Proceed knowing that version 6.0 or later additions are not available.
    // Use an alternate approach for older the DLL version.
}

Versions du projet

Pour vous assurer que votre application est compatible avec différentes versions ciblées d’un fichier .dll, des macros de version sont présentes dans les fichiers d’en-tête. Ces macros sont utilisées pour définir, exclure ou redéfinir certaines définitions pour différentes versions de la DLL. Pour obtenir une description détaillée de ces macros, consultez Utilisation des en-têtes Windows .

Par exemple, le nom de macro _WIN32_IE se trouve généralement dans les en-têtes plus anciens. Vous êtes responsable de la définition de la macro en tant que nombre hexadécimal. Ce numéro de version définit la version cible de l’application qui utilise la DLL. Le tableau suivant montre les numéros de version disponibles et l’effet de chacun sur votre application.

Version Description
0x0300 L’application est compatible avec ComCtl32.dll version 4.70 et ultérieure. L’application ne peut pas implémenter les fonctionnalités ajoutées après la version 4.70.
0x0400 L’application est compatible avec ComCtl32.dll version 4.71 et ultérieure. L’application ne peut pas implémenter les fonctionnalités ajoutées après la version 4.71.
0x0401 L’application est compatible avec ComCtl32.dll version 4.72 et ultérieure. L’application ne peut pas implémenter les fonctionnalités ajoutées après la version 4.72.
0x0500 L’application est compatible avec ComCtl32.dll version 5.80 et ultérieure. L’application ne peut pas implémenter les fonctionnalités ajoutées après la version 5.80.
0x0501 L’application est compatible avec ComCtl32.dll version 5.81 et ultérieure. L’application ne peut pas implémenter les fonctionnalités ajoutées après la version 5.81.
0x0600 L’application est compatible avec ComCtl32.dll version 6.0 et ultérieure. L’application ne peut pas implémenter les fonctionnalités ajoutées après la version 6.0.

 

Si vous ne définissez pas la macro _WIN32_IE dans votre projet, elle est automatiquement définie comme 0x0500. Pour définir une autre valeur, vous pouvez ajouter ce qui suit aux directives du compilateur dans votre fichier make ; remplacez le numéro de version souhaité pour 0x0400.

/D _WIN32_IE=0x0400

Une autre méthode consiste à ajouter une ligne similaire à ce qui suit dans votre code source avant d’inclure les fichiers d’en-tête Shell. Remplacez le numéro de version souhaité pour 0x0400.

#define _WIN32_IE 0x0400
#include <commctrl.h>

À propos des contrôles courants