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>