Dela via


Vanliga kontrollversioner

Det här avsnittet visar tillgängliga versioner av Common Control-biblioteket (ComCtl32.dll), beskriver hur du identifierar den version som programmet använder och förklarar hur du riktar in dig på ditt program för en viss version.

Det här avsnittet innehåller följande avsnitt.

Vanliga DLL-versionsnummer för kontroll

Stöd för vanliga kontroller tillhandahålls av ComCtl32.dll, som alla 32-bitars- och 64-bitarsversioner av Windows innehåller. Varje efterföljande version av DLL:n stöder funktionerna och API:et för tidigare versioner och lägger till nya funktioner.

Eftersom olika versioner av ComCtl32.dll distribuerades med Internet Explorer skiljer sig den aktiva versionen ibland från den version som levererades med operativsystemet. Därför måste ditt program direkt avgöra vilken version av ComCtl32.dll som finns.

I referensdokumentationen för vanliga kontroller anger många programmeringselement ett lägsta DLL-versionsnummer som stöds. Det här versionsnumret anger att programmeringselementet implementeras i den versionen och efterföljande versioner av DLL om inget annat anges. Om inget versionsnummer anges implementeras programmeringselementet i alla befintliga versioner av DLL:n.

I följande tabell beskrivs de olika DLL-versionerna och hur de distribuerades på operativsystem som stöds.

ComCtl32.dll

Version

Distributionsplattform

5.81

Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 och Microsoft Internet Explorer 6

5.82

Windows Server 2003, Windows Vista, Windows Server 2008 och Windows 7

6.0

Windows Server 2003

6.10

Windows Vista, Windows Server 2008 och Windows 7

 

Strukturstorlekar för olika vanliga kontrollversioner

Pågående förbättringar av vanliga kontroller har resulterat i behovet av att utöka många av strukturerna. Därför har storleken på strukturerna ändrats mellan olika versioner av Commctrl.h. Eftersom de flesta vanliga kontrollstrukturer har en strukturstorlek som en av parametrarna kan ett meddelande eller en funktion misslyckas om storleken inte identifieras. För att åtgärda detta har konstanter för strukturstorlek definierats som stöd för att rikta in sig på olika versioner av ComCtl32.dll. I följande lista definieras konstanterna för strukturstorlek.

Konstant strukturstorlek Definition
HDITEM_V1_SIZE Storleken på HDITEM- struktur i version 4.0.
IMAGELISTDRAWPARAMS_V3_SIZE Storleken på IMAGELISTDRAWPARAMS struktur i version 5.9.
LVCOLUMN_V1_SIZE Storleken på LVCOLUMN- struktur i version 4.0.
LVGROUP_V5_SIZE Storleken på LVGROUP- struktur i version 6.0.
LVHITTESTINFO_V1_SIZE Storleken på LVHITTESTINFO struktur i version 4.0.
LVITEM_V1_SIZE Storleken på LVITEM- struktur i version 4.0.
LVITEM_V5_SIZE Storleken på LVITEM- struktur i version 6.0.
LVTILEINFO_V5_SIZE Storleken på LVTILEINFO struktur i version 6.0.
MCHITTESTINFO_V1_SIZE Storleken på MCHITTESTINFO struktur i version 4.0.
NMLVCUSTOMDRAW_V3_SIZE Storleken på NMLVCUSTOMDRAW struktur i version 4.7.
NMTTDISPINFO_V1_SIZE Storleken på NMTTDISPINFO struktur i version 4.0.
NMTVCUSTOMDRAW_V3_SIZE Storleken på NMTVCUSTOMDRAW struktur i version 4.7.
PROPSHEETHEADER_V1_SIZE Storleken på PROPSHEETHEADER struktur i version 4.0.
PROPSHEETPAGE_V1_SIZE Storleken på PROPSHEETPAGE- struktur i version 4.0.
REBARBANDINFO_V3_SIZE Storleken på REBARBANDINFO struktur i version 4.7.
REBARBANDINFO_V6_SIZE Storleken på REBARBANDINFO struktur i version 6.0.
TTTOOLINFO_V1_SIZE Storleken på TOOLINFO struktur i version 4.0.
TTTOOLINFO_V2_SIZE Storleken på TOOLINFO struktur i version 4.7.
TTTOOLINFO_V3_SIZE Storleken på TOOLINFO struktur i version 6.0.
TVINSERTSTRUCT_V1_SIZE Storleken på TVINSERTSTRUCT struktur i version 4.0.

 

Använda DllGetVersion för att fastställa versionsnumret

Funktionen DllGetVersion kan anropas av ett program för att avgöra vilken DLL-version som finns i systemet.

DllGetVersion returnerar en DLLVERSIONINFO2 struktur. Förutom den information som tillhandahålls via DLLVERSIONINFOtillhandahåller DLLVERSIONINFO2 även snabbkorrigeringsnumret som identifierar det senaste installerade servicepaketet, vilket ger ett mer robust sätt att jämföra versionsnummer. Eftersom den första medlemmen i DLLVERSIONINFO2 är en DLLVERSIONINFO- struktur är den senare strukturen bakåtkompatibel.

Följande exempelfunktion GetVersion läser in en angiven DLL och försöker anropa funktionen DllGetVersion. Om det lyckas använder det ett makro för att packa huvud- och delversionsnumren från DLLVERSIONINFO struktur till en DWORD- som returneras till det anropande programmet. Om DLL inte exporterar DllGetVersionreturnerar funktionen noll. Du kan ändra funktionen för att hantera möjligheten att DllGetVersion returnerar en DLLVERSIONINFO2 struktur. I så fall använder du informationen i den DLLVERSIONINFO2 strukturens ullVersion medlem för att jämföra versioner, versionsnummer och Service Pack-versioner. Makrot MAKEDLLVERULL förenklar uppgiften att jämföra dessa värden med värdena i ullVersion.

Not

Att använda LoadLibrary felaktigt kan innebära säkerhetsrisker. Mer information om hur du läser in DLL:er med olika versioner av Windows finns i dokumentationen LoadLibrary.

 

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

I följande kodexempel visas hur du kan använda GetVersion för att testa om ComCtl32.dll är version 6.0 eller senare.

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

Projektversioner

För att säkerställa att programmet är kompatibelt med olika målversioner av en .dll fil finns versionsmakron i huvudfilerna. Dessa makron används för att definiera, exkludera eller omdefiniera vissa definitioner för olika versioner av DLL-filen. En detaljerad beskrivning av makrona finns i Använda Windows-huvuden.

Makronamnet _WIN32_IE finns till exempel ofta i äldre rubriker. Du ansvarar för att definiera makrot som ett hexadecimalt tal. Det här versionsnumret definierar målversionen av programmet som använder DLL:en. I följande tabell visas tillgängliga versionsnummer och vilken effekt var och en har på ditt program.

Version Beskrivning
0x0300 Programmet är kompatibelt med ComCtl32.dll version 4.70 och senare. Programmet kan inte implementera funktioner som har lagts till efter version 4.70.
0x0400 Programmet är kompatibelt med ComCtl32.dll version 4.71 och senare. Programmet kan inte implementera funktioner som har lagts till efter version 4.71.
0x0401 Programmet är kompatibelt med ComCtl32.dll version 4.72 och senare. Programmet kan inte implementera funktioner som har lagts till efter version 4.72.
0x0500 Programmet är kompatibelt med ComCtl32.dll version 5.80 och senare. Programmet kan inte implementera funktioner som har lagts till efter version 5.80.
0x0501 Programmet är kompatibelt med ComCtl32.dll version 5.81 och senare. Programmet kan inte implementera funktioner som har lagts till efter version 5.81.
0x0600 Programmet är kompatibelt med ComCtl32.dll version 6.0 och senare. Programmet kan inte implementera funktioner som har lagts till efter version 6.0.

 

Om du inte definierar _WIN32_IE makrot i projektet definieras det automatiskt som 0x0500. Om du vill definiera ett annat värde kan du lägga till följande i kompileringsdirektiven i din make-fil. byt ut önskat versionsnummer mot 0x0400.

/D _WIN32_IE=0x0400

En annan metod är att lägga till en rad som liknar följande i källkoden innan du inkluderar Shell-huvudfilerna. Ersätt önskat versionsnummer med 0x0400.

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

Om vanliga kontroller