Versions des DLL Shell et Shlwapi

Cette section explique comment déterminer la version des DLL shell sur lesquelles votre application s’exécute et comment cibler votre application pour une version spécifique.

Numéros de version dll

Tous les éléments de programmation abordés dans la documentation Shell sont contenus dans deux DLL : Shell32.dll et Shlwapi.dll. En raison des améliorations en cours, différentes versions de ces DLL implémentent des fonctionnalités différentes. Dans la documentation de référence de Shell, chaque élément de programmation spécifie un numéro de version de DLL pris en charge minimal. 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.

Avant Windows XP, les nouvelles versions Shell32.dll et Shlwapi.dll étaient parfois fournies avec les nouvelles versions de Windows Internet Explorer. Depuis Windows XP, ces DLL n’étaient plus fournies en tant que fichiers redistribuables en dehors des nouvelles versions de Windows lui-même. Le tableau suivant présente les différentes versions de DLL et la façon dont elles ont été distribuées depuis Microsoft Internet Explorer 3.0, Windows 95 et Microsoft Windows NT 4.0.

Shell32.dll version 4.0 se trouve dans les versions d’origine de Windows 95 et Microsoft Windows NT 4.0. L’interpréteur de commandes n’a pas été mis à jour avec Internet Explorer version 3.0, de sorte que Shell32.dll n’a pas de version 4.70. Shell32.dll versions 4.71 et 4.72 ont été livrées avec les versions internet Explorer correspondantes, mais elles n’ont pas nécessairement été installées (voir note 1). Pour les versions ultérieures à Microsoft Internet Explorer 4.01 et Windows 98, les numéros de version pour Shell32.dll et Shlwapi.dll divergent. En général, vous devez supposer que les DLL ont des numéros de version différents et testez-les séparément.

Shell32.dll

Version Plateforme de distribution
4.0 Windows 95 et Microsoft Windows NT 4.0
4.71 Microsoft Internet Explorer 4.0. Consultez la remarque 1.
4.72 Internet Explorer 4.01 et Windows 98. Consultez la remarque 1.
5,0 Windows 2000 et Windows Millennium Edition (Windows Me). Voir la note 2.
6.0 Windows XP
6.0.1 Windows Vista
6.1 Windows 7

Shlwapi.dll

Version Plateforme de distribution
4.0 Windows 95 et Microsoft Windows NT 4.0
4.71 Internet Explorer 4.0. Consultez la remarque 1.
4.72 Internet Explorer 4.01 et Windows 98. Consultez la remarque 1.
4,7 Internet Explorer 3.x
5,0 Microsoft Internet Explorer 5 et Windows 98 SE. Voir la note 2.
5.5 Microsoft Internet Explorer 5.5 et Windows Millennium Edition (Windows Me)
6.0 Windows XP et Windows Vista

Remarque 1 : Tous les systèmes avec Internet Explorer 4.0 ou 4.01 avaient la version associée de Shlwapi.dll (4.71 ou 4.72, respectivement). Toutefois, pour les systèmes antérieurs à Windows 98, Internet Explorer 4.0 et 4.01 peuvent être installés avec ou sans ce que l’on appelle l’interpréteur de commandes intégré. Si Internet Explorer a été installé avec l’interpréteur de commandes intégré, la version associée de Shell32.dll (4.71 ou 4.72) a également été installée. Si Internet Explorer a été installé sans l’interpréteur de commandes intégré, Shell32.dll est resté version 4.0. En d’autres termes, la présence de la version 4.71 ou 4.72 de Shlwapi.dll sur un système ne garantit pas que Shell32.dll a le même numéro de version. Tous les systèmes Windows 98 ont la version 4.72 de Shell32.dll.

Remarque 2 : La version 5.0 de Shlwapi.dll a été distribuée avec Internet Explorer 5 et a été trouvée sur tous les systèmes sur lesquels Internet Explorer 5 a été installé, à l’exception de Windows 2000. La version 5.0 de Shell32.dll a été distribuée en mode natif avec Windows 2000 et Windows Millennium Edition (Windows Me), ainsi que la version 5.0 de Shlwapi.dll.

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

À partir de la version 4.71, les DLL Shell, entre autres, ont commencé à exporter DllGetVersion. Cette fonction peut être appelée par une application pour déterminer quelle version de DLL est présente sur le système.

Notes

Les DLL n’exportent pas nécessairement DllGetVersion. Testez-le toujours avant d’essayer de l’utiliser.

Pour les versions de Windows antérieures à Windows 2000, DllGetVersion retourne une structure DLLVERSIONINFO qui contient les numéros de version principale et secondaire, le numéro de build et un ID de plateforme. Pour les systèmes Windows 2000 et ultérieurs, DllGetVersion peut retourner une structure DLLVERSIONINFO2 . En plus des informations fournies via DLLVERSIONINFO, DLLVERSIONINFO2fournit également le numéro de correctif logiciel qui identifie le dernier Service Pack installé, ce qui fournit 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 rétrocompatible.

Utilisation de DllGetVersion

L’exemple de fonction GetVersion suivant charge une DLL spécifiée et tente d’appeler sa fonction DllGetVersion . En cas de réussite, elle utilise une macro pour emballer 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. Avec les systèmes Windows 2000 et versions ultérieures, 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 du Service Pack. La macro MAKEDLLVERULL simplifie la comparaison de ces valeurs à celles dans ullVersion.

Notes

L’utilisation incorrecte de LoadLibrary peut présenter des risques de sécurité. Pour plus d’informations sur le chargement correct des DLL avec différentes versions de Windows, reportez-vous à la documentation LoadLibrary .

#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 Shell32.dll est version 6.0 ou ultérieure.

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

if(dwVer >= dwTarget)
{
    // This version of Shell32.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
0x0200 L’application est compatible avec Shell32.dll version 4.00 et ultérieure. L’application ne peut pas implémenter les fonctionnalités ajoutées après la version 4.00.
0x0300 L’application est compatible avec Shell32.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 Shell32.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 Shell32.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 Shell32.dll et Shlwapi.dll version 5.0 et ultérieure. L’application ne peut pas implémenter les fonctionnalités ajoutées après la version 5.0 de Shell32.dll et Shlwapi.dll.
0x0501 L’application est compatible avec Shell32.dll et Shlwapi.dll version 5.0 et ultérieure. L’application ne peut pas implémenter les fonctionnalités ajoutées après la version 5.0 de Shell32.dll et Shlwapi.dll.
0x0600 L’application est compatible avec Shell32.dll et Shlwapi.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 de Shell32.dll et Shlwapi.dll.

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>