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
- strukturstorlekar för olika vanliga kontrollversioner
- Använda DllGetVersion för att fastställa versionsnumret
- projektversioner
- Relaterade ämnen
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>
Relaterade ämnen