Megosztás a következőn keresztül:


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.

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>

A gyakori vezérlők