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

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>

Allgemeine Steuerelemente