Shell- und Shlwapi-DLL-Versionen

In diesem Abschnitt wird beschrieben, wie Sie bestimmen, auf welche Version der Shell-DLLs Ihre Anwendung ausgeführt wird, und wie Sie Ihre Anwendung auf eine bestimmte Version ausrichten.

DLL-Versionsnummern

Alle, aber eine Handvoll der in der Shell-Dokumentation beschriebenen Programmierelemente sind in zwei DLLs enthalten: Shell32.dll und Shlwapi.dll. Aufgrund fortlaufender Verbesserungen implementieren verschiedene Versionen dieser DLLs verschiedene Features. Während der Shell-Referenzdokumentation gibt jedes Programmierelement eine mindest unterstützte DLL-Versionsnummer an. Diese Versionsnummer gibt an, dass das Programmierelement in dieser Version und nachfolgenden Versionen der DLL implementiert wird, 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 ihre 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 ursprünglichen Versionen von Windows 95 und Microsoft Windows NT 4.0. Die Shell wurde nicht mit der Internet Explorer 3.0-Version aktualisiert, sodass Shell32.dll keine Version 4.70 besitzt. Shell32.dll Versionen 4.71 und 4.72 wurden mit den entsprechenden Internet Explorer-Versionen ausgeliefert, aber sie wurden nicht unbedingt installiert (siehe Hinweis 1). Für 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 verschiedene Versionsnummern haben und jede einzeln testen.

Shell32.dll

Version Verteilerplattform
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 Verteilerplattform
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 Mir)
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 oder 4.72). Für Systeme vor Windows 98 kann Internet Explorer 4.0 und 4.01 jedoch mit oder ohne die 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, blieb Shell32.dll als Version 4.0. Mit anderen Worten, die Anwesenheit 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 installiert wurde, mit Ausnahme von Windows 2000. Version 5.0 von Shell32.dll wurde native mit Windows 2000 und Windows Millennium Edition (Windows Me) zusammen mit Version 5.0 von Shlwapi.dll verteilt.

Verwenden von DllGetVersion zum Ermitteln der Versionsnummer

Ab Version 4.71 begann die Shell-DLLs, unter anderem, dllGetVersion zu exportieren. Diese Funktion kann von einer Anwendung aufgerufen werden, um festzustellen, 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öherer Systeme gibt DllGetVersion stattdessen eine DLLVERSIONINFO2-Struktur zurück. Zusätzlich zu den Informationen, die über DLLVERSIONINFO bereitgestellt werden, stellt DLLVERSIONINFO2also die Hotfixnummer bereit, die das neueste installierte Service Pack identifiziert, das eine robustere Möglichkeit zum Vergleichen von Versionsnummern bietet. Da das erste Mitglied von DLLVERSIONINFO2 eine DLLVERSIONINFO-Struktur ist, ist die spätere Struktur abwärtskompatible.

Verwenden von DllGetVersion

Die folgende Beispielfunktion GetVersion lädt eine angegebene DLL und versucht, die DllGetVersion-Funktion aufzurufen. Wenn sie erfolgreich verläuft, 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 keine DllGetVersion exportiert, gibt die Funktion null zurück. Mit Windows 2000 und späteren Systemen können Sie die Funktion ändern, um die Möglichkeit zu behandeln, dass DllGetVersion eine DLLVERSIONINFO2-Struktur zurückgibt. Verwenden Sie die Informationen in diesem DLLVERSIONINFO2-Element der ullVersion-Struktur , um Versionen, Buildnummern und Service Pack-Versionen zu vergleichen. Das MAKEDLLVERULL-Makro vereinfacht die Aufgabe, diese Werte mit denen in ullVersion zu vergleichen.

Hinweis

Die Verwendung von LoadLibrary kann Sicherheitsrisiken darstellen. Verweisen Sie auf die LoadLibrary-Dokumentation, um Informationen zum korrekten Laden von DLLs mit verschiedenen Versionen von Windows zu erhalten.

#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 testen können GetVersion , 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.
}

Project Versionen

Um sicherzustellen, dass Ihre Anwendung mit verschiedenen gezielten Versionen einer .dll-Datei kompatibel ist, sind Versionsmakros in den Kopfzeilendateien vorhanden. Diese Makros werden verwendet, um bestimmte Definitionen für verschiedene Versionen der DLL zu definieren, auszuschließen oder neu zu definieren. Weitere Informationen zu diesen Makros finden Sie unter Verwenden der Windows Kopfzeilen.

Der Makroname _WIN32_IE wird z. B. in älteren Kopfzeilen häufig gefunden. Sie sind verantwortlich für die Definition des Makros als Hexadezimalzahl. Diese Versionsnummer definiert die Zielversion der Anwendung, die die DLL verwendet. In der folgenden Tabelle sind die verfügbaren Versionsnummern und der Effekt auf Ihre Anwendung dargestellt.

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 _WIN32_IE Makro in Ihrem Projekt nicht definieren, wird sie automatisch als 0x0500 definiert. Um einen anderen Wert zu definieren, können Sie den Compilerrichtlinien in Ihrer Datei folgendes hinzufügen; Ersetzen Sie die gewünschte Versionsnummer für 0x0400.

/D _WIN32_IE=0x0400

Eine andere Methode besteht darin, eine Zeile ähnlich wie im Quellcode hinzuzufügen, bevor Sie die Shell-Kopfzeilendateien einschließen. Ersetzen Sie die gewünschte Versionsnummer für 0x0400.

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