Delen via


Shell- en Shlwapi DLL-versies

In deze sectie wordt beschreven hoe u kunt bepalen op welke versie van de Shell-DLL's uw toepassing wordt uitgevoerd en hoe u uw toepassing kunt richten op een specifieke versie.

DLL-versienummers

Alle maar een handvol programmeerelementen die in de Shell-documentatie worden besproken, zijn opgenomen in twee DLL's: Shell32.dll en Shlwapi.dll. Vanwege doorlopende verbeteringen implementeren verschillende versies van deze DLL's verschillende functies. In de Shell-referentiedocumentatie geeft elk programmeerelement een minimaal ondersteund DLL-versienummer op. Dit versienummer geeft aan dat het programmeerelement wordt geïmplementeerd in die versie en volgende versies van het DLL-bestand, tenzij anders opgegeven. Als er geen versienummer is opgegeven, wordt het programmeerelement geïmplementeerd in alle bestaande versies van het DLL-bestand.

Voor Windows XP werden nieuwe Shell32.dll en Shlwapi.dll versies soms geleverd met nieuwe versies van Windows Internet Explorer. Vanaf Windows XP werden deze DLL's niet langer geleverd als herdistribueerbare bestanden buiten nieuwe versies van Windows zelf. De volgende tabel bevat een overzicht van de verschillende DLL-versies en hoe ze zijn gedistribueerd die teruggaan naar Microsoft Internet Explorer 3.0, Windows 95 en Microsoft Windows NT 4.0.

Shell32.dll versie 4.0 is te vinden in de oorspronkelijke versies van Windows 95 en Microsoft Windows NT 4.0. De Shell is niet bijgewerkt met de release van Internet Explorer 3.0, dus Shell32.dll geen versie 4.70 heeft. Shell32.dll versies 4.71 en 4.72 zijn geleverd met de bijbehorende Internet Explorer-releases, maar ze zijn niet noodzakelijkerwijs geïnstalleerd (zie opmerking 1). Voor releases na Microsoft Internet Explorer 4.01 en Windows 98 zijn de versienummers voor Shell32.dll en Shlwapi.dll afwijken. Over het algemeen moet u ervan uitgaan dat de DLL's verschillende versienummers hebben en elk afzonderlijk testen.

Shell32.dll

Versie Distributieplatform
4.0 Windows 95 en Microsoft Windows NT 4.0
4.71 Microsoft Internet Explorer 4.0. Zie opmerking 1.
4.72 Internet Explorer 4.01 en Windows 98. Zie opmerking 1.
5.0 Windows 2000 en Windows Millennium Edition (Windows Me). Zie opmerking 2.
6.0 Windows XP
6.0.1 Windows Vista
6.1 Windows 7

Shlwapi.dll

Versie Distributieplatform
4.0 Windows 95 en Microsoft Windows NT 4.0
4.71 Internet Explorer 4.0. Zie opmerking 1.
4.72 Internet Explorer 4.01 en Windows 98. Zie opmerking 1.
4.7 Internet Explorer 3.x
5.0 Microsoft Internet Explorer 5 en Windows 98 SE. Zie opmerking 2.
5.5 Microsoft Internet Explorer 5.5 en Windows Millennium Edition (Windows Me)
6.0 Windows XP en Windows Vista

Opmerking 1: Alle systemen met Internet Explorer 4.0 of 4.01 hadden respectievelijk de bijbehorende versie van Shlwapi.dll (respectievelijk 4.71 of 4.72). Voor systemen vóór Windows 98 kan Internet Explorer 4.0 en 4.01 echter worden geïnstalleerd met of zonder wat bekend staat als de geïntegreerde Shell-. Als Internet Explorer is geïnstalleerd met de geïntegreerde Shell, is ook de bijbehorende versie van Shell32.dll (4.71 of 4.72) geïnstalleerd. Als Internet Explorer zonder de geïntegreerde Shell is geïnstalleerd, bleef Shell32.dll als versie 4.0. Met andere woorden, de aanwezigheid van versie 4.71 of 4.72 van Shlwapi.dll op een systeem garandeert niet dat Shell32.dll hetzelfde versienummer heeft. Alle Windows 98-systemen hebben versie 4.72 van Shell32.dll.

Opmerking 2: versie 5.0 van Shlwapi.dll is gedistribueerd met Internet Explorer 5 en gevonden op alle systemen waarop Internet Explorer 5 is geïnstalleerd, met uitzondering van Windows 2000. Versie 5.0 van Shell32.dll is systeemeigen gedistribueerd met Windows 2000 en Windows Millennium Edition (Windows Me), samen met versie 5.0 van Shlwapi.dll.

DllGetVersion gebruiken om het versienummer te bepalen

Vanaf versie 4.71 zijn onder andere de Shell-DLL's begonnen met het exporteren van DllGetVersion. Deze functie kan worden aangeroepen door een toepassing om te bepalen welke DLL-versie aanwezig is op het systeem.

Notitie

DLL's exporteren niet noodzakelijkerwijs DllGetVersion-. Test deze altijd voordat u deze probeert te gebruiken.

Voor Windows-versies ouder dan Windows 2000 retourneert DllGetVersion een DLLVERSIONINFO structuur met de primaire en secundaire versienummers, het buildnummer en een platform-id. Voor Windows 2000- en hogersystemen kan DllGetVersion- in plaats daarvan een DLLVERSIONINFO2 structuur retourneren. Naast de informatie die wordt verstrekt via DLLVERSIONINFO, biedt DLLVERSIONINFO2ook het hotfixnummer waarmee het meest recente geïnstalleerde servicepack wordt geïdentificeerd, wat een krachtigere manier biedt om versienummers te vergelijken. Omdat het eerste lid van DLLVERSIONINFO2 een DLLVERSIONINFO structuur is, is de latere structuur compatibel met eerdere versies.

DllGetVersion gebruiken

De volgende voorbeeldfunctie GetVersion een opgegeven DLL laadt en probeert de DllGetVersion--functie aan te roepen. Als dit lukt, wordt een macro gebruikt om de primaire en secundaire versienummers van de DLLVERSIONINFO structuur in te pakken in een DWORD- die wordt geretourneerd naar de aanroepende toepassing. Als het DLL-bestand DllGetVersion-niet exporteert, retourneert de functie nul. Met Windows 2000- en hogersystemen kunt u de functie wijzigen om de mogelijkheid te verwerken dat DllGetVersion een DLLVERSIONINFO2 structuur retourneert. Als dat zo is, gebruikt u de informatie in die DLLVERSIONINFO2 structuur ullVersion lid om versies, buildnummers en servicepack-releases te vergelijken. De MAKEDLLVERULL macro vereenvoudigt de taak om deze waarden te vergelijken met die in ullVersion.

Notitie

Het gebruik van LoadLibrary kan beveiligingsrisico's opleveren. Raadpleeg de documentatie LoadLibrary voor informatie over het correct laden van DLL's met verschillende versies van 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;
}

In het volgende codevoorbeeld ziet u hoe u GetVersion kunt gebruiken om te testen of Shell32.dll versie 6.0 of hoger is.

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.
}

Projectversies

Om ervoor te zorgen dat uw toepassing compatibel is met verschillende doelversies van een .dll-bestand, zijn versiemacro's aanwezig in de headerbestanden. Deze macro's worden gebruikt om bepaalde definities voor verschillende versies van het DLL-bestand te definiëren, uit te sluiten of opnieuw te definiëren. Zie De Windows-kopteksten gebruiken voor een uitgebreide beschrijving van deze macro's.

De macronaam _WIN32_IE wordt bijvoorbeeld vaak gevonden in oudere kopteksten. U bent verantwoordelijk voor het definiëren van de macro als een hexadecimaal getal. Dit versienummer definieert de doelversie van de toepassing die gebruikmaakt van het DLL-bestand. In de volgende tabel ziet u de beschikbare versienummers en het effect dat elk op uw toepassing heeft.

Versie Beschrijving
0x0200 De toepassing is compatibel met Shell32.dll versie 4.00 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 4.00.
0x0300 De toepassing is compatibel met Shell32.dll versie 4.70 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 4.70.
0x0400 De toepassing is compatibel met Shell32.dll versie 4.71 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 4.71.
0x0401 De toepassing is compatibel met Shell32.dll versie 4.72 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 4.72.
0x0500 De toepassing is compatibel met Shell32.dll en Shlwapi.dll versie 5.0 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 5.0 van Shell32.dll en Shlwapi.dll.
0x0501 De toepassing is compatibel met Shell32.dll en Shlwapi.dll versie 5.0 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 5.0 van Shell32.dll en Shlwapi.dll.
0x0600 De toepassing is compatibel met Shell32.dll en Shlwapi.dll versie 6.0 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 6.0 van Shell32.dll en Shlwapi.dll.

Als u de _WIN32_IE macro in uw project niet definieert, wordt deze automatisch gedefinieerd als 0x0500. Als u een andere waarde wilt definiëren, kunt u het volgende toevoegen aan de compiler-instructies in uw make-bestand; vervang het gewenste versienummer voor 0x0400.

/D _WIN32_IE=0x0400

Een andere methode is om een regel toe te voegen die vergelijkbaar is met het volgende in uw broncode voordat u de Shell-headerbestanden opneemt. Vervang het gewenste versienummer door 0x0400.

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