Freigeben über


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 Programmierelemente, die in der Shell-Dokumentation behandelt werden, sind in zwei DLLs enthalten: Shell32.dll und Shlwapi.dll. Aufgrund fortlaufender Verbesserungen implementieren unterschiedliche Versionen dieser DLLs unterschiedliche Features. In 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 ist, wird das Programmierelement in allen vorhandenen Versionen der DLL implementiert.

Vor Windows XP wurden manchmal neue Shell32.dll- und Shlwapi.dll-Versionen mit neuen Versionen von Windows Internet Explorer bereitgestellt. Ab Windows XP wurden diese DLLs nicht mehr als weitervertreibbare 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 der Internet Explorer 3.0-Version aktualisiert, sodass Shell32.dll keine Version 4.70 aufweist. Shell32.dll Versionen 4.71 und 4.72 wurden mit den entsprechenden Internet Explorer-Versionen ausgeliefert, jedoch nicht unbedingt installiert (siehe Hinweis 1). Für Versionen, die auf Microsoft Internet Explorer 4.01 und Windows 98 folgt, unterscheiden sich die Versionsnummern für Shell32.dll und Shlwapi.dll abweichen. Im Allgemeinen sollten Sie davon ausgehen, dass die DLLs über unterschiedliche Versionsnummern verfügen 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 zugeordnete Version von Shlwapi.dll (4.71 oder 4.72). Für Systeme vor Windows 98 können Internet Explorer 4.0 und 4.01 jedoch mit oder ohne das, was als integrierte Shell-bezeichnet wurde, 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. 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 aufweist. 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 nativ mit Windows 2000 und Windows Millennium Edition (Windows Me) zusammen mit Version 5.0 von Shlwapi.dllverteilt.

Verwenden von DllGetVersion zum Ermitteln der Versionsnummer

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

Anmerkung

DLLs exportieren nicht unbedingt DllGetVersion. Testen Sie es immer, bevor Sie versuchen, sie 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öhere Systeme gibt DllGetVersion- stattdessen eine DLLVERSIONINFO2 Struktur zurück. Zusätzlich zu den Informationen, die über DLLVERSIONINFObereitgestellt werden, stellt DLLVERSIONINFO2auch die Hotfixnummer bereit, die das neueste installierte Service Pack identifiziert, das 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, die DllGetVersion--Funktion aufzurufen. Bei erfolgreicher Ausführung wird ein Makro verwendet, um die Haupt- und Nebenversionsnummern aus der DLLVERSIONINFO- Struktur in eine DWORD- zu packen, die an die aufrufende Anwendung zurückgegeben wird. Wenn die DLL DllGetVersionnicht exportiert, gibt die Funktion Null zurück. Mit Windows 2000- und höher-Systemen können Sie die Funktion so ändern, dass DllGetVersion eine DLLVERSIONINFO2 Struktur zurückgibt. Wenn ja, verwenden Sie die Informationen in dieser DLLVERSIONINFO2 Struktur ullVersion Mitglied, um Versionen, Buildnummern und Service Pack-Versionen zu vergleichen. Das MAKEDLLVERULL Makro vereinfacht das Vergleichen dieser Werte mit denen in ullVersion.

Anmerkung

Die Verwendung LoadLibrary- kann Sicherheitsrisiken darstellen. Informationen zum ordnungsgemäßen Laden von DLLs mit verschiedenen Versionen von Windows 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 GetVersion verwenden 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.
}

Project-Versionen

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.

Beispielsweise wird der Makroname _WIN32_IE häufig in älteren Kopfzeilen gefunden. Sie sind für die Definition des Makros als hexadezimale Zahl verantwortlich. Diese Versionsnummer definiert die Zielversion der Anwendung, die die DLL verwendet. In der folgenden Tabelle sind die verfügbaren Versionsnummern und die Auswirkungen aufgeführt, die jeweils für Ihre Anwendung gelten.

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.dllhinzugefü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.dllhinzugefü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.dllhinzugefügt wurden.

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

/D _WIN32_IE=0x0400

Eine weitere Methode besteht darin, eine Zeile ähnlich wie im Quellcode hinzuzufügen, bevor Sie die Shell-Headerdateien einfügen. Ersetzen Sie die gewünschte Versionsnummer für 0x0400.

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