Teilen über


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

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>

zu allgemeinen Steuerelementen