Allgemeine Steuerelementversionen
In diesem Thema werden die verfügbaren Versionen der allgemeinen Steuerelementbibliothek (ComCtl32.dll) aufgeführt, in der beschrieben wird, wie Sie die version identifizieren, die Ihre Anwendung verwendet, und erläutert, wie Sie Ihre Anwendung auf eine bestimmte Version ausrichten.
Dieses Thema enthält die folgenden Abschnitte.
- Allgemeine Steuerelement-DLL-Versionsnummern
- Strukturgrößen für verschiedene allgemeine Steuerelementversionen
- Verwenden von DllGetVersion zur Ermittlung der Versionsnummer
- project versions
- Verwandte Themen
Allgemeine Steuerelement-DLL-Versionsnummern
Unterstützung für allgemeine Steuerelemente wird von ComCtl32.dllbereitgestellt, die alle 32-Bit- und 64-Bit-Versionen von Windows enthalten. Jede aufeinander folgende Version der DLL unterstützt die Features und API früherer Versionen und fügt neue Features hinzu.
Da verschiedene Versionen von ComCtl32.dll mit Internet Explorer verteilt wurden, unterscheidet sich die aktive Version manchmal von der Version, die mit dem Betriebssystem ausgeliefert wurde. Daher muss Ihre Anwendung direkt bestimmen, welche Version von ComCtl32.dll vorhanden ist.
In der Referenzdokumentation zu allgemeinen Steuerelementen geben viele Programmierelemente eine minimale 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.
In der folgenden Tabelle werden die verschiedenen DLL-Versionen und deren Verteilung auf unterstützten OSes beschrieben.
ComCtl32.dll
Version
Verteilungsplattform
5.81
Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 und Microsoft Internet Explorer 6
5.82
Windows Server 2003, Windows Vista, Windows Server 2008 und Windows 7
6.0
Windows Server 2003
6.10
Windows Vista, Windows Server 2008 und Windows 7
Strukturgrößen für verschiedene allgemeine Steuerelementversionen
Kontinuierliche Verbesserungen an gemeinsamen Steuerelementen haben dazu geführt, dass viele der Strukturen erweitert werden müssen. Aus diesem Grund hat sich die Größe der Strukturen zwischen verschiedenen Versionen von Commctrl.h geändert. Da die meisten gängigen Steuerelementstrukturen eine Strukturgröße als einen der Parameter übernehmen, kann eine Nachricht oder Funktion fehlschlagen, wenn die Größe nicht erkannt wird. Um dies zu beheben, wurden Strukturgrößenkonstanten definiert, um die Ausrichtung auf verschiedene Versionen von ComCtl32.dllzu unterstützen. In der folgenden Liste werden die Strukturgrößenkonstanten definiert.
Strukturgröße -Konstante | Definition |
---|---|
HDITEM_V1_SIZE | Die Größe der HDITEM- Struktur in Version 4.0. |
IMAGELISTDRAWPARAMS_V3_SIZE | Die Größe der IMAGELISTDRAWPARAMS- Struktur in Version 5.9. |
LVCOLUMN_V1_SIZE | Die Größe der LVCOLUMN- Struktur in Version 4.0. |
LVGROUP_V5_SIZE | Die Größe der LVGROUP- Struktur in Version 6.0. |
LVHITTESTINFO_V1_SIZE | Die Größe der LVHITTESTINFO- Struktur in Version 4.0. |
LVITEM_V1_SIZE | Die Größe der LVITEM- Struktur in Version 4.0. |
LVITEM_V5_SIZE | Die Größe der LVITEM- Struktur in Version 6.0. |
LVTILEINFO_V5_SIZE | Die Größe der LVTILEINFO- Struktur in Version 6.0. |
MCHITTESTINFO_V1_SIZE | Die Größe der MCHITTESTINFO Struktur in Version 4.0. |
NMLVCUSTOMDRAW_V3_SIZE | Die Größe der NMLVCUSTOMDRAW Struktur in Version 4.7. |
NMTTDISPINFO_V1_SIZE | Die Größe der NMTTDISPINFO- Struktur in Version 4.0. |
NMTVCUSTOMDRAW_V3_SIZE | Die Größe der NMTVCUSTOMDRAW- Struktur in Version 4.7. |
PROPSHEETHEADER_V1_SIZE | Die Größe der PROPSHEETHEADER- Struktur in Version 4.0. |
PROPSHEETPAGE_V1_SIZE | Die Größe der PROPSHEETPAGE- Struktur in Version 4.0. |
REBARBANDINFO_V3_SIZE | Die Größe der REBARBANDINFO Struktur in Version 4.7. |
REBARBANDINFO_V6_SIZE | Die Größe der REBARBANDINFO Struktur in Version 6.0. |
TTTOOLINFO_V1_SIZE | Die Größe der TOOLINFO- Struktur in Version 4.0. |
TTTOOLINFO_V2_SIZE | Die Größe der TOOLINFO- Struktur in Version 4.7. |
TTTOOLINFO_V3_SIZE | Die Größe der TOOLINFO- Struktur in Version 6.0. |
TVINSERTSTRUCT_V1_SIZE | Die Größe der TVINSERTSTRUCT Struktur in Version 4.0. |
Verwenden von DllGetVersion zum Ermitteln der Versionsnummer
Die DllGetVersion--Funktion kann von einer Anwendung aufgerufen werden, um zu bestimmen, welche DLL-Version auf dem System vorhanden ist.
DllGetVersion- gibt eine DLLVERSIONINFO2 Struktur zurück. Zusätzlich zu den Informationen, die über DLLVERSIONINFObereitgestellt werden, stellt DLLVERSIONINFO2 auch 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.
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. Sie können 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;
}
Das folgende Codebeispiel zeigt, wie Sie GetVersion
verwenden können, um zu testen, ob ComCtl32.dll Version 6.0 oder höher ist.
LPCTSTR lpszDllName = L"C:\\Windows\\System32\\ComCtl32.dll";
DWORD dwVer = GetVersion(lpszDllName);
DWORD dwTarget = PACKVERSION(6,0);
if(dwVer >= dwTarget)
{
// This version of ComCtl32.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 |
---|---|
0x0300 | Die Anwendung ist mit ComCtl32.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 ComCtl32.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 ComCtl32.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 ComCtl32.dll Version 5.80 und höher kompatibel. Die Anwendung kann keine Features implementieren, die nach Version 5.80 hinzugefügt wurden. |
0x0501 | Die Anwendung ist mit ComCtl32.dll Version 5.81 und höher kompatibel. Die Anwendung kann keine Features implementieren, die nach Version 5.81 hinzugefügt wurden. |
0x0600 | Die Anwendung ist mit ComCtl32.dll Version 6.0 und höher kompatibel. Die Anwendung kann keine Features implementieren, die nach Version 6.0 hinzugefü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>
Verwandte Themen