Allgemeine Steuerelementversionen
In diesem Thema werden die verfügbaren Versionen der Common Control-Bibliothek (ComCtl32.dll) aufgelistet, beschrieben, 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 folgende Abschnitte:
- Allgemeine Versionsnummern der Steuerungs-DLL
- Strukturgrößen für verschiedene allgemeine Steuerelementversionen
- Verwenden von DllGetVersion zum Bestimmen der Versionsnummer
- Projektversionen
- Zugehörige Themen
Allgemeine Versionsnummern der Steuerungs-DLL
Unterstützung für allgemeine Steuerelemente wird von ComCtl32.dll bereitgestellt, die alle 32-Bit- und 64-Bit-Versionen von Windows enthalten. Jede aufeinanderfolgende Version der DLL unterstützt die Features und die 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 unterstützte Mindest-DLL-Versionsnummer an. Diese Versionsnummer gibt an, dass das Programmierelement in dieser Version und nachfolgenden Versionen der DLL implementiert ist, sofern nichts anderes angegeben ist. Wenn keine Versionsnummer angegeben wird, 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 Betriebssystemen 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
Fortlaufende Verbesserungen an allgemeinen 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 einer der Parameter annehmen, kann eine Nachricht oder Funktion fehlschlagen, wenn die Größe nicht erkannt wird. Um dies zu beheben, wurden Strukturgrößenkonstanten definiert, um verschiedene Versionen von ComCtl32.dll zu unterstützen. Die folgende Liste definiert die Strukturgrößenkonstanten.
Strukturgrößenkonstante | 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 Bestimmen 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 DLLVERSIONINFO bereitgestellt werden, stellt DLLVERSIONINFO2 auch die Hotfixnummer bereit, die das zuletzt installierte Service Pack identifiziert, was 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ärtskompatibel.
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. Sie können die Funktion ändern, um die Möglichkeit zu behandeln, dass DllGetVersion eine DLLVERSIONINFO2-Struktur zurückgibt. Wenn dies der Fall ist, verwenden Sie 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 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 verwenden GetVersion
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.
}
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 ist beispielsweise häufig in älteren Headern zu finden. 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 |
---|---|
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 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>
Zugehörige Themen