Delen via


Algemene besturingsversies

In dit onderwerp worden de beschikbare versies van de Common Control-bibliotheek (ComCtl32.dll) beschreven hoe u de versie kunt identificeren die uw toepassing gebruikt en wordt uitgelegd hoe u uw toepassing kunt richten op een specifieke versie.

Dit onderwerp bevat de volgende secties.

Common Control DLL Versions Numbers

Ondersteuning voor algemene besturingselementen wordt geleverd door ComCtl32.dll, waaronder alle 32-bits en 64-bits versies van Windows. Elke opeenvolgende versie van het DLL-bestand ondersteunt de functies en API van eerdere versies en voegt nieuwe functies toe.

Omdat verschillende versies van ComCtl32.dll zijn gedistribueerd met Internet Explorer, verschilt de versie die actief is soms van de versie die bij het besturingssysteem is geleverd. Daarom moet uw toepassing rechtstreeks bepalen welke versie van ComCtl32.dll aanwezig is.

In de referentiedocumentatie voor algemene besturingselementen geven veel programmeerelementen een minimaal ondersteund DLL-versienummer op. Dit versienummer geeft aan dat het programmeerelement wordt geïmplementeerd in die versie en volgende versies van het DLL-bestand, tenzij anders opgegeven. Als er geen versienummer is opgegeven, wordt het programmeerelement geïmplementeerd in alle bestaande versies van het DLL-bestand.

De volgende tabel bevat een overzicht van de verschillende DLL-versies en hoe deze zijn gedistribueerd op ondersteunde besturingssystemen.

ComCtl32.dll

Versie

Distributieplatform

5.81

Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 en Microsoft Internet Explorer 6

5.82

Windows Server 2003, Windows Vista, Windows Server 2008 en Windows 7

6.0

Windows Server 2003

6.10

Windows Vista, Windows Server 2008 en Windows 7

 

Structuurgrootten voor verschillende algemene besturingsversies

Voortdurende verbeteringen aan algemene controles hebben geresulteerd in de noodzaak om veel van de structuren uit te breiden. Daarom is de grootte van de structuren veranderd tussen verschillende versies van Commctrl.h. Omdat de meeste algemene besturingsstructuren een structuurgrootte als een van de parameters hebben, kan een bericht of functie mislukken als de grootte niet wordt herkend. Om dit te verhelpen, zijn structuurgrootteconstanten gedefinieerd om te helpen bij het richten van verschillende versies van ComCtl32.dll. In de volgende lijst worden de structuurgrootteconstanten gedefinieerd.

Structuurgrootteconstante Definitie
HDITEM_V1_SIZE De grootte van de HDITEM structuur in versie 4.0.
IMAGELISTDRAWPARAMS_V3_SIZE De grootte van de IMAGELISTDRAWPARAMS structuur in versie 5.9.
LVCOLUMN_V1_SIZE De grootte van de LVCOLUMN structuur in versie 4.0.
LVGROUP_V5_SIZE De grootte van de LVGROUP structuur in versie 6.0.
LVHITTESTINFO_V1_SIZE De grootte van de LVHITTESTINFO structuur in versie 4.0.
LVITEM_V1_SIZE De grootte van de LVITEM structuur in versie 4.0.
LVITEM_V5_SIZE De grootte van de LVITEM structuur in versie 6.0.
LVTILEINFO_V5_SIZE De grootte van de LVTILEINFO structuur in versie 6.0.
MCHITTESTINFO_V1_SIZE De grootte van de MCHITTESTINFO structuur in versie 4.0.
NMLVCUSTOMDRAW_V3_SIZE De grootte van de NMLVCUSTOMDRAW structuur in versie 4.7.
NMTTDISPINFO_V1_SIZE De grootte van de NMTTDISPINFO structuur in versie 4.0.
NMTVCUSTOMDRAW_V3_SIZE De grootte van de NMTVCUSTOMDRAW structuur in versie 4.7.
PROPSHEETHEADER_V1_SIZE De grootte van de PROPSHEETHEADER structuur in versie 4.0.
PROPSHEETPAGE_V1_SIZE De grootte van de PROPSHEETPAGE structuur in versie 4.0.
REBARBANDINFO_V3_SIZE De grootte van de REBARBANDINFO structuur in versie 4.7.
REBARBANDINFO_V6_SIZE De grootte van de REBARBANDINFO structuur in versie 6.0.
TTTOOLINFO_V1_SIZE De grootte van de TOOLINFO structuur in versie 4.0.
TTTOOLINFO_V2_SIZE De grootte van de TOOLINFO structuur in versie 4.7.
TTTOOLINFO_V3_SIZE De grootte van de TOOLINFO structuur in versie 6.0.
TVINSERTSTRUCT_V1_SIZE De grootte van de TVINSERTSTRUCT structuur in versie 4.0.

 

DllGetVersion gebruiken om het versienummer te bepalen

De DllGetVersion functie kan worden aangeroepen door een toepassing om te bepalen welke DLL-versie aanwezig is op het systeem.

DllGetVersion- retourneert een DLLVERSIONINFO2 structuur. Naast de informatie die wordt verstrekt via DLLVERSIONINFO, biedt DLLVERSIONINFO2 ook het hotfixnummer waarmee het meest recente geïnstalleerde servicepack wordt geïdentificeerd, wat een krachtigere manier biedt om versienummers te vergelijken. Omdat het eerste lid van DLLVERSIONINFO2 een DLLVERSIONINFO structuur is, is de latere structuur compatibel met eerdere versies.

De volgende voorbeeldfunctie GetVersion een opgegeven DLL laadt en probeert de DllGetVersion--functie aan te roepen. Als dit lukt, wordt een macro gebruikt om de primaire en secundaire versienummers van de DLLVERSIONINFO structuur in te pakken in een DWORD- die wordt geretourneerd naar de aanroepende toepassing. Als het DLL-bestand DllGetVersion-niet exporteert, retourneert de functie nul. U kunt de functie wijzigen om de mogelijkheid te verwerken dat DllGetVersion een DLLVERSIONINFO2 structuur retourneert. Als dat zo is, gebruikt u de informatie in die DLLVERSIONINFO2 structuur ullVersion lid om versies, buildnummers en servicepack-releases te vergelijken. De MAKEDLLVERULL macro vereenvoudigt de taak om deze waarden te vergelijken met die in ullVersion.

Notitie

Het gebruik van LoadLibrary kan beveiligingsrisico's opleveren. Raadpleeg de documentatie LoadLibrary voor informatie over het correct laden van DLL's met verschillende versies van Windows.

 

#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;
}

In het volgende codevoorbeeld ziet u hoe u GetVersion kunt gebruiken om te testen of ComCtl32.dll versie 6.0 of hoger is.

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.
}

Projectversies

Om ervoor te zorgen dat uw toepassing compatibel is met verschillende doelversies van een .dll-bestand, zijn versiemacro's aanwezig in de headerbestanden. Deze macro's worden gebruikt om bepaalde definities voor verschillende versies van het DLL-bestand te definiëren, uit te sluiten of opnieuw te definiëren. Zie De Windows-kopteksten gebruiken voor een uitgebreide beschrijving van deze macro's.

De macronaam _WIN32_IE wordt bijvoorbeeld vaak gevonden in oudere kopteksten. U bent verantwoordelijk voor het definiëren van de macro als een hexadecimaal getal. Dit versienummer definieert de doelversie van de toepassing die gebruikmaakt van het DLL-bestand. In de volgende tabel ziet u de beschikbare versienummers en het effect dat elk op uw toepassing heeft.

Versie Beschrijving
0x0300 De toepassing is compatibel met ComCtl32.dll versie 4.70 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 4.70.
0x0400 De toepassing is compatibel met ComCtl32.dll versie 4.71 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 4.71.
0x0401 De toepassing is compatibel met ComCtl32.dll versie 4.72 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 4.72.
0x0500 De toepassing is compatibel met ComCtl32.dll versie 5.80 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 5.80.
0x0501 De toepassing is compatibel met ComCtl32.dll versie 5.81 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 5.81.
0x0600 De toepassing is compatibel met ComCtl32.dll versie 6.0 en hoger. De toepassing kan geen functies implementeren die zijn toegevoegd na versie 6.0.

 

Als u de _WIN32_IE macro in uw project niet definieert, wordt deze automatisch gedefinieerd als 0x0500. Als u een andere waarde wilt definiëren, kunt u het volgende toevoegen aan de compiler-instructies in uw make-bestand; vervang het gewenste versienummer voor 0x0400.

/D _WIN32_IE=0x0400

Een andere methode is om een regel toe te voegen die vergelijkbaar is met het volgende in uw broncode voordat u de Shell-headerbestanden opneemt. Vervang het gewenste versienummer door 0x0400.

#define _WIN32_IE 0x0400
#include <commctrl.h>

Over algemene besturingselementen