Versions de 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
- à l’aide de DllGetVersion pour déterminer le numéro de version
- versions de projet
Numéros de version dll
Tous mais quelques é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 différentes fonctionnalités. Dans la documentation de référence shell, chaque élément de programmation spécifie 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.
Avant Windows XP, de nouvelles Shell32.dll et Shlwapi.dll versions ont parfois été fournies avec de nouvelles versions de Windows Internet Explorer. À partir de Windows XP, ces DLL n’ont plus été fournies en tant que fichiers redistribuables en dehors de nouvelles versions de Windows. Le tableau suivant présente les différentes versions de DLL et la façon dont elles ont été distribuées datant de 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 la version Internet Explorer 3.0. Par conséquent, Shell32.dll n’a pas de version 4.70. Shell32.dll versions 4.71 et 4.72 ont été fournies avec les versions correspondantes d’Internet Explorer, mais elles n’étaient pas nécessairement installées (voir la 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 règle générale, vous devez supposer que les DLL ont des numéros de version différents et testent chacune d’elles 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. Voir la note 1. |
4.72 | Internet Explorer 4.01 et Windows 98. Voir la note 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. Voir la note 1. |
4.72 | Internet Explorer 4.01 et Windows 98. Voir la note 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 respectivement la version associée de Shlwapi.dll (4.71 ou 4.72). Toutefois, pour les systèmes antérieurs à Windows 98, Internet Explorer 4.0 et 4.01 peuvent être installés avec ou sans ce qu’on appelait shell 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é en tant que 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 : 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
À compter 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 DLL est présente sur le système.
Note
Les DLL n’exportent pas nécessairement DllGetVersion. Testez-le toujours avant de tenter de l’utiliser.
Pour les versions de Windows antérieures à Windows 2000, DllGetVersion retourne une structure DLLVERSIONINFO qui contient les numéros de version principaux et secondaires, 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. Outre les informations fournies via DLLVERSIONINFO, DLLVERSIONINFO2fournit également le numéro de correctif logiciel qui identifie le dernier Service Pack installé, 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 rétrocompatible.
Utilisation de DllGetVersion
L’exemple de fonction suivant GetVersion
charge une DLL spécifiée et tente d’appeler sa fonction DllGetVersion. Si elle réussit, elle utilise une macro pour packer les numéros de version principaux et secondaires de la structure DLLVERSIONINFOdans une DWORD retournée à 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 de cette structure DLLVERSIONINFO2membre ullVersion pour comparer les versions, les numéros de build et les versions de Service Pack. La macro MAKEDLLVERULL simplifie la tâche de comparer ces valeurs à celles de ullVersion.
Note
L’utilisation LoadLibrary peut poser des risques de sécurité incorrects. Reportez-vous à la documentation LoadLibrary pour plus d’informations sur la façon de charger correctement 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 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 de projet
Pour vous assurer que votre application est compatible avec différentes versions ciblées d’un fichier .dll, les 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. Consultez Utilisation des en-têtes Windows pour obtenir une description détaillée de ces macros.
Par exemple, le nom de macro _WIN32_IE est généralement trouvé 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 présente les numéros de version disponibles et l’effet que chacun a sur votre application.
Version | Description |
---|---|
0x0200 | L’application est compatible avec Shell32.dll version 4.00 et ultérieures. L’application ne peut pas implémenter les fonctionnalités qui ont été ajoutées après la version 4.00. |
0x0300 | L’application est compatible avec Shell32.dll version 4.70 et ultérieures. L’application ne peut pas implémenter les fonctionnalités qui ont été 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 qui ont été 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 des fonctionnalités qui ont été 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 qui ont été 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 qui ont été 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 qui ont été 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 valeur différente, vous pouvez ajouter les instructions suivantes aux directives du compilateur dans votre fichier make ; remplacez le numéro de version souhaité par 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é par 0x0400.
#define _WIN32_IE 0x0400
#include <commctrl.h>