Gyakori vezérlőverziók
Ez a témakör a Common Control könyvtár elérhető verzióit (ComCtl32.dll) sorolja fel, ismerteti, hogyan azonosíthatja az alkalmazás által használt verziót, és ismerteti, hogyan célozhatja meg az alkalmazást egy adott verzióra.
Ez a témakör a következő szakaszokat tartalmazza.
- gyakori vezérlő DLL-verziók számai
- különböző közös vezérlőverziók szerkezetméretei
- DllGetVersion használata a verziószám meghatározásához
- Projektverziók
- Kapcsolódó témakörök
A vezérlő DLL-verzióinak gyakori számai
A gyakori vezérlők támogatását a ComCtl32.dllbiztosítja, amelyet a Windows mind a 32 bites és a 64 bites verziója tartalmaz. A DLL minden egymást követő verziója támogatja a korábbi verziók funkcióit és API-ját, és új funkciókat ad hozzá.
Mivel a ComCtl32.dll különböző verzióit terjesztették az Internet Explorerrel, az aktív verzió néha eltér az operációs rendszerrel szállított verziótól. Ezért az alkalmazásnak közvetlenül meg kell határoznia, hogy a ComCtl32.dll melyik verziója van jelen.
A közös vezérlők referenciadokumentációjában számos programozási elem meghatároz egy minimálisan támogatott DLL-verziószámot. Ez a verziószám azt jelzi, hogy a programozási elem az adott verzióban és a DLL későbbi verzióiban van implementálva, kivéve, ha másként van megadva. Ha nincs megadva verziószám, a programozási elem a DLL összes meglévő verziójában implementálva lesz.
Az alábbi táblázat a különböző DLL-verziókat és azok támogatott operációs rendszereken való terjesztésének módját ismerteti.
ComCtl32.dll
Verzió
Terjesztési platform
5.81
Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 és Microsoft Internet Explorer 6
5.82
Windows Server 2003, Windows Vista, Windows Server 2008 és Windows 7
6.0
Windows Server 2003
6.10
Windows Vista, Windows Server 2008 és Windows 7
Struktúraméretek különböző gyakori vezérlőverziókhoz
A közös vezérlők folyamatos fejlesztései miatt számos struktúrát ki kell terjeszteni. Ezért a struktúrák mérete a Commctrl.h különböző verziói között megváltozott. Mivel a gyakran használt vezérlőstruktúrák többsége egy struktúraméretet használ a paraméterek egyikeként, egy üzenet vagy függvény meghiúsulhat, ha a méretet nem ismeri fel a rendszer. Ennek orvoslása érdekében a szerkezet méretállandóit úgy határoztuk meg, hogy segítsük a ComCtl32.dllkülönböző verziójának megcélzását. Az alábbi lista a struktúra méretállandóit határozza meg.
Struktúra méretállandója | Definíció |
---|---|
HDITEM_V1_SIZE | A HDITEM szerkezetének mérete a 4.0-s verzióban. |
IMAGELISTDRAWPARAMS_V3_SIZE | Az IMAGELISTDRAWPARAMS szerkezetének mérete az 5.9-es verzióban. |
LVCOLUMN_V1_SIZE | Az LVCOLUMN szerkezetének mérete a 4.0-s verzióban. |
LVGROUP_V5_SIZE | Az LVGROUP szerkezetének mérete a 6.0-s verzióban. |
LVHITTESTINFO_V1_SIZE | Az LVHITTESTINFO szerkezetének mérete a 4.0-s verzióban. |
LVITEM_V1_SIZE | A LVITEM szerkezetének mérete a 4.0-s verzióban. |
LVITEM_V5_SIZE | A LVITEM szerkezetének mérete a 6.0-s verzióban. |
LVTILEINFO_V5_SIZE | Az LVTILEINFO szerkezet mérete a 6.0-s verzióban. |
MCHITTESTINFO_V1_SIZE | A MCHITTESTINFO szerkezetének mérete a 4.0-s verzióban. |
NMLVCUSTOMDRAW_V3_SIZE | A NMLVCUSTOMDRAW szerkezetének mérete a 4.7-es verzióban. |
NMTTDISPINFO_V1_SIZE | A NMTDISPINFO szerkezetének mérete a 4.0-s verzióban. |
NMTVCUSTOMDRAW_V3_SIZE | A NMTVCUSTOMDRAW szerkezetének mérete a 4.7-es verzióban. |
PROPSHEETHEADER_V1_SIZE | A PROPSHEETHEADER szerkezetének mérete a 4.0-s verzióban. |
PROPSHEETPAGE_V1_SIZE | A PROPSHEETPAGE szerkezetének mérete a 4.0-s verzióban. |
REBARBANDINFO_V3_SIZE | A REBARBANDINFO szerkezetének mérete a 4.7-es verzióban. |
REBARBANDINFO_V6_SIZE | A REBARBANDINFO szerkezet mérete a 6.0-s verzióban. |
TTTOOLINFO_V1_SIZE | A TOOLINFO szerkezet mérete a 4.0-s verzióban. |
TTTOOLINFO_V2_SIZE | A TOOLINFO szerkezet mérete a 4.7-es verzióban. |
TTTOOLINFO_V3_SIZE | A TOOLINFO szerkezet mérete a 6.0-s verzióban. |
TVINSERTSTRUCT_V1_SIZE | A TVINSERTSTRUCT szerkezetének mérete a 4.0-s verzióban. |
A DllGetVersion használata a verziószám meghatározásához
Az alkalmazás meghívhatja a DllGetVersion függvényt annak megállapításához, hogy melyik DLL-verzió található a rendszeren.
DllGetVersion egy DLLVERSIONINFO2 struktúrát ad vissza. A DLLVERSIONINFOáltal biztosított információk mellett DLLVERSIONINFO2 a legújabb telepített szervizcsomagot azonosító gyorsjavítási számot is biztosítja, amely robusztusabb módot kínál a verziószámok összehasonlítására. Mivel a DLLVERSIONINFO2 első tagja egy DLLVERSIONINFO struktúra, a későbbi struktúra visszamenőlegesen kompatibilis.
Az alábbi mintafüggvény egy megadott DLL-t tölt be GetVersion
, és megpróbálja meghívni a DllGetVersion függvényt. Ha sikeres, makróval csomagolja be a fő- és alverziószámokat a DLLVERSIONINFO struktúrából egy DWORD, amelyet a rendszer visszaad a hívó alkalmazásnak. Ha a DLL nem exportálja DllGetVersion, a függvény nullát ad vissza. Módosíthatja a függvényt annak a lehetőségnek a kezelésére, hogy DllGetVersionDLLVERSIONINFO2 struktúrát ad vissza. Ha igen, használja az adott DLLVERSIONINFO2 szerkezet ullVersion tagjának adatait a verziók, buildszámok és szervizcsomagok kiadásainak összehasonlításához. A MAKEDLLVERULL makró egyszerűbbé teszi ezeknek az értékeknek az összehasonlítását az ullVersion.
Jegyzet
A LoadLibrary helytelen használata biztonsági kockázatot jelenthet. A DLL-ek különböző Windows-verziókkal való helyes betöltéséről a LoadLibrary dokumentációjában olvashat.
#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;
}
Az alábbi példakód bemutatja, hogyan tesztelheti GetVersion
, hogy ComCtl32.dll 6.0-s vagy újabb verzió-e.
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.
}
Projektverziók
Annak érdekében, hogy az alkalmazás kompatibilis legyen egy .dll-fájl különböző célzott verzióival, a fejlécfájlokban verziómakrók találhatók. Ezek a makrók a DLL különböző verzióinak bizonyos definícióinak definiálására, kizárására vagy újradefinitálására szolgálnak. A makrók részletes leírását a A Windows-fejlécek című témakörben talál.
A _WIN32_IE makrónév például gyakran megtalálható a régebbi fejlécekben. A makró hexadecimális számként való definiálásáért Ön a felelős. Ez a verziószám határozza meg a DLL-t használó alkalmazás célverzióját. Az alábbi táblázat az elérhető verziószámokat és az egyes alkalmazásokra gyakorolt hatást mutatja be.
Verzió | Leírás |
---|---|
0x0300 | Az alkalmazás kompatibilis ComCtl32.dll 4.70-es és újabb verziójával. Az alkalmazás nem tudja implementálni a 4.70-es verzió után hozzáadott funkciókat. |
0x0400 | Az alkalmazás kompatibilis ComCtl32.dll 4.71-es és újabb verziójával. Az alkalmazás nem tudja implementálni a 4.71-es verzió után hozzáadott funkciókat. |
0x0401 | Az alkalmazás kompatibilis ComCtl32.dll 4.72-es és újabb verziójával. Az alkalmazás nem tudja implementálni a 4.72-es verzió után hozzáadott funkciókat. |
0x0500 | Az alkalmazás kompatibilis ComCtl32.dll 5.80-es és újabb verziójával. Az alkalmazás nem tudja implementálni az 5.80-at követően hozzáadott funkciókat. |
0x0501 | Az alkalmazás kompatibilis ComCtl32.dll 5.81-es és újabb verziójával. Az alkalmazás nem tudja implementálni az 5.81-es verzió után hozzáadott funkciókat. |
0x0600 | Az alkalmazás kompatibilis ComCtl32.dll 6.0-s és újabb verziójával. Az alkalmazás nem tudja implementálni a 6.0-s verzió után hozzáadott funkciókat. |
Ha nem definiálja a _WIN32_IE makrót a projektben, az automatikusan 0x0500 ként lesz definiálva. Egy másik érték meghatározásához hozzáadhatja a következőt a fordítási irányelvekhez a fájlban; helyettesítse a kívánt verziószámot a 0x0400.
/D _WIN32_IE=0x0400
Egy másik módszer a következőhöz hasonló sor hozzáadása a forráskódban, mielőtt belefoglalja a Shell-fejlécfájlokat. Cserélje le a kívánt verziószámot a 0x0400.
#define _WIN32_IE 0x0400
#include <commctrl.h>
Kapcsolódó témakörök