Shell- und Shlwapi-DLL-Versionen

In diesem Abschnitt wird beschrieben, wie Sie ermitteln, auf welcher Version der Shell-DLLs Ihre Anwendung ausgeführt wird, und wie Ihre Anwendung auf eine bestimmte Version ausgerichtet werden soll.

DLL-Versionsnummern

Bis auf eine Handvoll der in der Shelldokumentation beschriebenen Programmierelemente sind alle in zwei DLLs enthalten: Shell32.dll und Shlwapi.dll. Aufgrund der fortlaufenden Verbesserungen implementieren verschiedene Versionen dieser DLLs unterschiedliche Features. In der Shell-Referenzdokumentation gibt jedes Programmierelement eine unterstützte Mindestversionsnummer der DLL an. Diese Versionsnummer gibt an, dass das Programmierelement in dieser Version und nachfolgenden Versionen der DLL implementiert ist, sofern nicht anders angegeben. Wenn keine Versionsnummer angegeben wird, wird das Programmierelement in allen vorhandenen Versionen der DLL implementiert.

Vor Windows XP wurden neue Shell32.dll- und Shlwapi.dll-Versionen manchmal mit neuen Versionen von Windows Internet Explorer bereitgestellt. Ab Windows XP wurden diese DLLs nicht mehr als verteilbare Dateien außerhalb neuer Versionen von Windows selbst bereitgestellt. In der folgenden Tabelle werden die verschiedenen DLL-Versionen und deren Verteilung auf Microsoft Internet Explorer 3.0, Windows 95 und Microsoft Windows NT 4.0 beschrieben.

Shell32.dll Version 4.0 befindet sich in den Originalversionen von Windows 95 und Microsoft Windows NT 4.0. Die Shell wurde nicht mit dem Internet Explorer Version 3.0 aktualisiert, sodass Shell32.dll keine Version 4.70 aufweist. Shell32.dll Versionen 4.71 und 4.72 wurden mit den entsprechenden Internet Explorer Releases ausgeliefert, aber nicht unbedingt installiert (siehe Hinweis 1). Bei Versionen nach Microsoft Internet Explorer 4.01 und Windows 98 unterscheiden sich die Versionsnummern für Shell32.dll und Shlwapi.dll. Im Allgemeinen sollten Sie davon ausgehen, dass die DLLs unterschiedliche Versionsnummern aufweisen und jede einzeln testen.

Shell32.dll

Version Verteilungsplattform
4,0 Windows 95 und Microsoft Windows NT 4.0
4.71 Microsoft Internet Explorer 4.0. (siehe Hinweis 1).
4.72 Internet Explorer 4.01 und Windows 98. (siehe Hinweis 1).
5.0 Windows 2000 und Windows Millennium Edition (Windows Me). Siehe Hinweis 2.
6.0 Windows XP
6.0.1 Windows Vista
6.1 Windows 7

Shlwapi.dll

Version Verteilungsplattform
4,0 Windows 95 und Microsoft Windows NT 4.0
4.71 Internet Explorer 4.0. (siehe Hinweis 1).
4.72 Internet Explorer 4.01 und Windows 98. (siehe Hinweis 1).
4.7 Internet Explorer 3.x
5.0 Microsoft Internet Explorer 5 und Windows 98 SE. Siehe Hinweis 2.
5.5 Microsoft Internet Explorer 5.5 und Windows Millennium Edition (Windows Me)
6.0 Windows XP und Windows Vista

Hinweis 1: Alle Systeme mit Internet Explorer 4.0 oder 4.01 hatten die zugehörige Version von Shlwapi.dll (4.71 bzw. 4.72). Für Systeme vor Windows 98 können internet Explorer 4.0 und 4.01 jedoch mit oder ohne die sogenannte integrierte Shell installiert werden. Wenn internet Explorer mit der integrierten Shell installiert wurde, wurde auch die zugehörige Version von Shell32.dll (4.71 oder 4.72) installiert. Wenn Internet Explorer ohne die integrierte Shell installiert wurde, Shell32.dll als Version 4.0 beibehalten. Anders ausgedrückt: Das Vorhandensein von Version 4.71 oder 4.72 von Shlwapi.dll auf einem System garantiert nicht, dass Shell32.dll dieselbe Versionsnummer hat. Alle Windows 98-Systeme verfügen über version 4.72 von Shell32.dll.

Hinweis 2: Version 5.0 von Shlwapi.dll wurde mit Internet Explorer 5 verteilt und wurde auf allen Systemen gefunden, auf denen Internet Explorer 5 mit Ausnahme von Windows 2000 installiert war. Version 5.0 von Shell32.dll wurde nativ mit Windows 2000 und Windows Millennium Edition (Windows Me) sowie version 5.0 von Shlwapi.dll vertrieben.

Verwenden von DllGetVersion zum Ermitteln der Versionsnummer

Ab Version 4.71 begannen unter anderem die Shell-DLLs mit dem Export von DllGetVersion. Diese Funktion kann von einer Anwendung aufgerufen werden, um zu bestimmen, welche DLL-Version auf dem System vorhanden ist.

Hinweis

DLLs exportieren DllGetVersion nicht unbedingt. Testen Sie es immer, bevor Sie versuchen, es zu verwenden.

Für Windows-Versionen vor Windows 2000 gibt DllGetVersion eine DLLVERSIONINFO-Struktur zurück, die die Haupt- und Nebenversionsnummern, die Buildnummer und eine Plattform-ID enthält. Für Windows 2000- und höher-Systeme kann DllGetVersion stattdessen eine DLLVERSIONINFO2-Struktur zurückgeben. Zusätzlich zu den Informationen, die über DLLVERSIONINFO bereitgestellt werden, stellt DLLVERSIONINFO2auch die Hotfixnummer bereit, die das neueste installierte Service Pack identifiziert, was eine robustere Möglichkeit zum Vergleichen von Versionsnummern bietet. Da das erste Element von DLLVERSIONINFO2 eine DLLVERSIONINFO-Struktur ist, ist die spätere Struktur abwärtskompatibel.

Verwenden von DllGetVersion

Die folgende Beispielfunktion GetVersion lädt eine angegebene DLL und versucht, ihre DllGetVersion-Funktion aufzurufen. Bei erfolgreicher Ausführung wird ein Makro verwendet, um die Haupt- und Nebenversionsnummern aus der DLLVERSIONINFO-Struktur in ein DWORD zu packen, das an die aufrufende Anwendung zurückgegeben wird. Wenn die DLL DllGetVersion nicht exportiert, gibt die Funktion null zurück. Bei Systemen unter Windows 2000 und höher können Sie die Funktion so ändern, dass dllGetVersion eine DLLVERSIONINFO2-Struktur zurückgibt. Verwenden Sie in diesem Fall die Informationen im ullVersion-Member dieser DLLVERSIONINFO2-Struktur, um Versionen, Buildnummern und Service Pack-Releases zu vergleichen. Das MAKEDLLVERULL-Makro vereinfacht den Vergleich dieser Werte mit denen in ullVersion.

Hinweis

Die falsche Verwendung von LoadLibrary kann Sicherheitsrisiken darstellen. Informationen zum ordnungsgemäßen Laden von DLLs mit verschiedenen Windows-Versionen finden Sie in der LoadLibrary-Dokumentation .

#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;
}

Im folgenden Codebeispiel wird veranschaulicht, wie Sie verwenden GetVersion können, um zu testen, ob Shell32.dll Version 6.0 oder höher ist.

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

Projektversionen

Um sicherzustellen, dass Ihre Anwendung mit verschiedenen Zielversionen einer .dll-Datei kompatibel ist, sind Versionsmakros in den Headerdateien vorhanden. Diese Makros werden verwendet, um bestimmte Definitionen für verschiedene Versionen der DLL zu definieren, auszuschließen oder neu zu definieren. Eine ausführliche Beschreibung dieser Makros finden Sie unter Verwenden der Windows-Header .

Der Makroname _WIN32_IE wird beispielsweise häufig in älteren Headern gefunden. Sie sind dafür verantwortlich, das Makro als Hexadezimalzahl zu definieren. Diese Versionsnummer definiert die Zielversion der Anwendung, die die DLL verwendet. In der folgenden Tabelle sind die verfügbaren Versionsnummern und die auswirkungen auf Ihre Anwendung aufgeführt.

Version BESCHREIBUNG
0x0200 Die Anwendung ist mit Shell32.dll Version 4.00 und höher kompatibel. Die Anwendung kann keine Features implementieren, die nach Version 4.00 hinzugefügt wurden.
0x0300 Die Anwendung ist mit Shell32.dll Version 4.70 und höher kompatibel. Die Anwendung kann keine Features implementieren, die nach Version 4.70 hinzugefügt wurden.
0x0400 Die Anwendung ist mit Shell32.dll Version 4.71 und höher kompatibel. Die Anwendung kann keine Features implementieren, die nach Version 4.71 hinzugefügt wurden.
0x0401 Die Anwendung ist mit Shell32.dll Version 4.72 und höher kompatibel. Die Anwendung kann keine Features implementieren, die nach Version 4.72 hinzugefügt wurden.
0x0500 Die Anwendung ist mit Shell32.dll und Shlwapi.dll Version 5.0 und höher kompatibel. Die Anwendung kann keine Features implementieren, die nach Version 5.0 von Shell32.dll und Shlwapi.dll hinzugefügt wurden.
0x0501 Die Anwendung ist mit Shell32.dll und Shlwapi.dll Version 5.0 und höher kompatibel. Die Anwendung kann keine Features implementieren, die nach Version 5.0 von Shell32.dll und Shlwapi.dll hinzugefügt wurden.
0x0600 Die Anwendung ist mit Shell32.dll und Shlwapi.dll Version 6.0 und höher kompatibel. Die Anwendung kann keine Features implementieren, die nach Version 6.0 von Shell32.dll und Shlwapi.dll hinzugefügt wurden.

Wenn Sie das makro _WIN32_IE in Ihrem Projekt nicht definieren, wird es automatisch als 0x0500 definiert. Um einen anderen Wert zu definieren, können Sie den Compilerdirektiven in Ihrer Make-Datei Folgendes hinzufügen: ersetzen Sie die gewünschte Versionsnummer durch 0x0400.

/D _WIN32_IE=0x0400

Eine andere Methode besteht darin, eine Zeile ähnlich der folgenden im Quellcode hinzuzufügen, bevor Sie die Shell-Headerdateien einschließen. Ersetzen Sie die gewünschte Versionsnummer durch 0x0400.

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