Sdílet prostřednictvím


Běžné verze ovládacích prvků

Toto téma obsahuje seznam dostupných verzí knihovny Common Control (ComCtl32.dll), popisuje, jak identifikovat verzi, kterou vaše aplikace používá, a vysvětluje, jak cílit na vaši aplikaci pro konkrétní verzi.

Toto téma obsahuje následující části.

Běžná čísla verzí knihovny DLL ovládacích prvků

Podpora běžných ovládacích prvků je poskytována ComCtl32.dll, které zahrnují všechny 32bitové a 64bitové verze Systému Windows. Každá následná verze knihovny DLL podporuje funkce a rozhraní API starších verzí a přidává nové funkce.

Vzhledem k tomu, že se v Internet Exploreru distribuovaly různé verze ComCtl32.dll, verze, která je aktivní, se někdy liší od verze dodané s operačním systémem. Aplikace proto musí přímo určit, která verze ComCtl32.dll je k dispozici.

V referenční dokumentaci k běžným ovládacím prvkům mnoho programovacích prvků určuje minimální podporované číslo verze knihovny DLL. Toto číslo verze označuje, že programovací prvek je implementován v této verzi a následných verzích knihovny DLL, pokud není zadán jinak. Pokud není zadáno žádné číslo verze, programovací prvek je implementován ve všech existujících verzích knihovny DLL.

Následující tabulka popisuje různé verze knihoven DLL a způsob jejich distribuce v podporovaných operačních systémů.

ComCtl32.dll

Verze

Distribuční platforma

5.81

Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 a Microsoft Internet Explorer 6

5.82

Windows Server 2003, Windows Vista, Windows Server 2008 a Windows 7

6.0

Windows Server 2003

6.10

Windows Vista, Windows Server 2008 a Windows 7

 

Velikosti struktur pro různé běžné verze ovládacích prvků

Průběžná vylepšení běžných ovládacích prvků vedly k tomu, že je potřeba rozšířit mnoho struktur. Z tohoto důvodu se velikost struktur změnila mezi různými verzemi commctrl.h. Vzhledem k tomu, že většina běžných řídicích struktur má jako jeden z parametrů velikost struktury, může zpráva nebo funkce selhat, pokud velikost není rozpoznána. K nápravě tohoto stavu byly definovány konstanty velikosti struktury, které pomáhají cílit na jinou verzi ComCtl32.dll. Následující seznam definuje konstanty velikosti struktury.

Konstanta velikosti struktury Definice
HDITEM_V1_SIZE Velikost struktury HDITEM ve verzi 4.0.
IMAGELISTDRAWPARAMS_V3_SIZE Velikost struktury IMAGELISTDRAWPARAMS ve verzi 5.9.
LVCOLUMN_V1_SIZE Velikost LVCOLUMN struktury ve verzi 4.0.
LVGROUP_V5_SIZE Velikost struktury LVGROUP ve verzi 6.0.
LVHITTESTINFO_V1_SIZE Velikost struktury LVHITTESTINFO ve verzi 4.0.
LVITEM_V1_SIZE Velikost struktury LVITEM ve verzi 4.0.
LVITEM_V5_SIZE Velikost struktury LVITEM ve verzi 6.0.
LVTILEINFO_V5_SIZE Velikost struktury LVTILEINFO ve verzi 6.0.
MCHITTESTINFO_V1_SIZE Velikost struktury MCHITTESTINFO ve verzi 4.0.
NMLVCUSTOMDRAW_V3_SIZE Velikost struktury NMLVCUSTOMDRAW ve verzi 4.7.
NMTTDISPINFO_V1_SIZE Velikost struktury NMTTDISPINFO ve verzi 4.0.
NMTVCUSTOMDRAW_V3_SIZE Velikost struktury NMTVCUSTOMDRAW ve verzi 4.7.
PROPSHEETHEADER_V1_SIZE Velikost struktury PROPSHEETHEADER ve verzi 4.0.
PROPSHEETPAGE_V1_SIZE Velikost struktury PROPSHEETPAGE ve verzi 4.0.
REBARBANDINFO_V3_SIZE Velikost struktury REBARBANDINFO ve verzi 4.7.
REBARBANDINFO_V6_SIZE Velikost struktury REBARBANDINFO ve verzi 6.0.
TTTOOLINFO_V1_SIZE Velikost struktury TOOLINFO ve verzi 4.0.
TTTOOLINFO_V2_SIZE Velikost struktury TOOLINFO ve verzi 4.7.
TTTOOLINFO_V3_SIZE Velikost struktury TOOLINFO ve verzi 6.0.
TVINSERTSTRUCT_V1_SIZE Velikost struktury TVINSERTSTRUCT ve verzi 4.0.

 

Určení čísla verze pomocí knihovny DllGetVersion

Funkci DllGetVersion lze volat aplikací k určení verze knihovny DLL v systému.

DllGetVersion vrátí DLLVERSIONINFO2 strukturu. Kromě informací poskytovaných prostřednictvím DLLVERSIONINFO, DLLVERSIONINFO2 také poskytuje číslo opravy hotfix, které identifikuje nejnovější nainstalovanou aktualizaci Service Pack, která poskytuje robustnější způsob porovnání čísel verzí. Protože první člen DLLVERSIONINFO2 je DLLVERSIONINFO struktury, pozdější struktura je zpětně kompatibilní.

Následující ukázková funkce GetVersion načte zadanou knihovnu DLL a pokusí se volat její funkci DllGetVersion. V případě úspěchu použije makro k zabalení čísel hlavních a podverzí z DLLVERSIONINFO struktury do DWORD, který se vrátí volající aplikaci. Pokud knihovna DLL neexportuje DllGetVersion, vrátí funkce nulu. Funkci můžete upravit tak, aby zvládla možnost, že DllGetVersion vrátí DLLVERSIONINFO2 strukturu. Pokud ano, použijte informace v této DLLVERSIONINFO2 struktury ullVersion člen k porovnání verzí, čísel buildů a verzí aktualizace Service Pack. Makro MAKEDLLVERULL zjednodušuje porovnání těchto hodnot s hodnotami v ullVersion.

Poznámka

Použití LoadLibrary nesprávně může představovat bezpečnostní rizika. Informace o tom, jak správně načíst knihovny DLL s různými verzemi Windows, najdete v dokumentaci 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;
}

Následující příklad kódu ukazuje, jak můžete pomocí GetVersion otestovat, jestli je ComCtl32.dll verze 6.0 nebo novější.

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

Verze projektu

Aby byla vaše aplikace kompatibilní s různými cílovými verzemi souboru .dll, jsou makra verzí obsažena v souborech hlaviček. Tato makra slouží k definování, vyloučení nebo opětovnému definování určitých definic pro různé verze knihovny DLL. Podrobné popisy těchto maker najdete v tématu Použití záhlaví systému Windows.

Například název makra _WIN32_IE se běžně nachází ve starších záhlavích. Zodpovídáte za definování makra jako šestnáctkového čísla. Toto číslo verze definuje cílovou verzi aplikace, která používá knihovnu DLL. Následující tabulka uvádí dostupná čísla verzí a vliv jednotlivých verzí na vaši aplikaci.

Verze Popis
0x0300 Aplikace je kompatibilní s ComCtl32.dll verze 4.70 a novější. Aplikace nemůže implementovat funkce přidané po verzi 4.70.
0x0400 Aplikace je kompatibilní s ComCtl32.dll verze 4.71 a novější. Aplikace nemůže implementovat funkce přidané po verzi 4.71.
0x0401 Aplikace je kompatibilní s ComCtl32.dll verze 4.72 a novější. Aplikace nemůže implementovat funkce přidané po verzi 4.72.
0x0500 Aplikace je kompatibilní s ComCtl32.dll verze 5.80 a novější. Aplikace nemůže implementovat funkce přidané po verzi 5.80.
0x0501 Aplikace je kompatibilní s ComCtl32.dll verze 5.81 a novější. Aplikace nemůže implementovat funkce přidané po verzi 5.81.
0x0600 Aplikace je kompatibilní s ComCtl32.dll verze 6.0 a novější. Aplikace nemůže implementovat funkce přidané po verzi 6.0.

 

Pokud v projektu nedefinujete _WIN32_IE makro, je automaticky definováno jako 0x0500. Pokud chcete definovat jinou hodnotu, můžete do direktiv kompilátoru v souboru make přidat následující kód; nahraďte požadovaným číslem verze 0x0400.

/D _WIN32_IE=0x0400

Další metodou je přidat řádek podobný následujícímu ve zdrojovém kódu před zahrnutím souborů hlaviček prostředí. Nahraďte požadované číslo verze 0x0400.

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

o běžných ovládacích prvcích