Udostępnij za pośrednictwem


Typowe wersje kontrolek

W tym temacie wymieniono dostępne wersje biblioteki Common Control (ComCtl32.dll), opisano sposób identyfikowania używanej wersji aplikacji oraz wyjaśniono, jak kierować aplikację do określonej wersji.

Ten temat zawiera następujące sekcje.

Typowe numery wersji biblioteki DLL kontrolek

Obsługa typowych kontrolek jest zapewniana przez ComCtl32.dll, które obejmują wszystkie 32-bitowe i 64-bitowe wersje systemu Windows. Każda kolejna wersja biblioteki DLL obsługuje funkcje i interfejs API wcześniejszych wersji oraz dodaje nowe funkcje.

Ponieważ różne wersje ComCtl32.dll były dystrybuowane za pomocą programu Internet Explorer, wersja aktywna jest czasami inna niż wersja dostarczana z systemem operacyjnym. W związku z tym aplikacja musi bezpośrednio określić, która wersja ComCtl32.dll jest obecna.

W dokumentacji referencyjnej wspólnych kontrolek wiele elementów programowania określa minimalny obsługiwany numer wersji biblioteki DLL. Ten numer wersji wskazuje, że element programowania jest implementowany w tej wersji i kolejnych wersjach biblioteki DLL, chyba że określono inaczej. Jeśli nie określono numeru wersji, element programowania jest implementowany we wszystkich istniejących wersjach biblioteki DLL.

W poniższej tabeli przedstawiono różne wersje bibliotek DLL i sposób ich dystrybucji w obsługiwanych systemach operacyjnych.

ComCtl32.dll

Wersja

Platforma dystrybucji

5.81

Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 i Microsoft Internet Explorer 6

5.82

Windows Server 2003, Windows Vista, Windows Server 2008 i Windows 7

6.0

Windows Server 2003

6.10

Windows Vista, Windows Server 2008 i Windows 7

 

Rozmiary struktury dla różnych typowych wersji kontrolek

Ciągłe ulepszenia wspólnych mechanizmów kontroli spowodowały konieczność rozszerzenia wielu struktur. Z tego powodu rozmiar struktur zmienił się między różnymi wersjami commctrl.h. Ponieważ większość typowych struktur sterujących ma rozmiar struktury jako jeden z parametrów, komunikat lub funkcja może zakończyć się niepowodzeniem, jeśli rozmiar nie zostanie rozpoznany. Aby rozwiązać ten problem, stałe rozmiaru struktury zostały zdefiniowane w celu pomocy w określaniu celu innej wersji ComCtl32.dll. Poniższa lista definiuje stałe rozmiaru struktury.

Stała rozmiar struktury Definicja
HDITEM_V1_SIZE Rozmiar strukturyHDITEM w wersji 4.0.
IMAGELISTDRAWPARAMS_V3_SIZE Rozmiar struktury IMAGELISTDRAWPARAMS w wersji 5.9.
LVCOLUMN_V1_SIZE Rozmiar struktury LVCOLUMN w wersji 4.0.
LVGROUP_V5_SIZE Rozmiar struktury LVGROUP w wersji 6.0.
LVHITTESTINFO_V1_SIZE Rozmiar struktury LVHITTESTINFO w wersji 4.0.
LVITEM_V1_SIZE Rozmiar struktury LVITEM w wersji 4.0.
LVITEM_V5_SIZE Rozmiar struktury LVITEM w wersji 6.0.
LVTILEINFO_V5_SIZE Rozmiar struktury LVTILEINFO w wersji 6.0.
MCHITTESTINFO_V1_SIZE Rozmiar strukturyMCHITTESTINFOw wersji 4.0.
NMLVCUSTOMDRAW_V3_SIZE Rozmiar struktury NMLVCUSTOMDRAW w wersji 4.7.
NMTTDISPINFO_V1_SIZE Rozmiar struktury NMTTDISPINFO w wersji 4.0.
NMTVCUSTOMDRAW_V3_SIZE Rozmiar struktury NMTVCUSTOMDRAW w wersji 4.7.
PROPSHEETHEADER_V1_SIZE Rozmiar struktury PROPSHEETHEADER w wersji 4.0.
PROPSHEETPAGE_V1_SIZE Rozmiar struktury PROPSHEETPAGE w wersji 4.0.
REBARBANDINFO_V3_SIZE Rozmiar struktury REBARBANDINFO w wersji 4.7.
REBARBANDINFO_V6_SIZE Rozmiar struktury REBARBANDINFO w wersji 6.0.
TTTOOLINFO_V1_SIZE Rozmiar struktury TOOLINFO w wersji 4.0.
TTTOOLINFO_V2_SIZE Rozmiar struktury TOOLINFO w wersji 4.7.
TTTOOLINFO_V3_SIZE Rozmiar struktury TOOLINFO w wersji 6.0.
TVINSERTSTRUCT_V1_SIZE Rozmiar struktury TVINSERTSTRUCT w wersji 4.0.

 

Określanie numeru wersji przy użyciu biblioteki DllGetVersion

Funkcja DllGetVersion może być wywoływana przez aplikację w celu określenia, która wersja biblioteki DLL jest obecna w systemie.

DllGetVersion zwraca strukturę DLLVERSIONINFO2. Oprócz informacji dostarczonych za pośrednictwem DLLVERSIONINFO, DLLVERSIONINFO2 zawiera również numer poprawki identyfikujący najnowszy zainstalowany dodatek Service Pack, który zapewnia bardziej niezawodny sposób porównywania numerów wersji. Ponieważ pierwszy element członkowski DLLVERSIONINFO2 jest strukturą DLLVERSIONINFO, późniejsza struktura jest zgodna z poprzednimi wersjami.

Poniższa przykładowa funkcja GetVersion ładuje określoną bibliotekę DLL i próbuje wywołać funkcję DllGetVersion. Jeśli operacja powiedzie się, używa makra do spakowania głównych i pomocniczych numerów wersji z struktury DLLVERSIONINFO do DWORD, która jest zwracana do aplikacji wywołującej. Jeśli biblioteka DLL nie eksportuje DllGetVersion, funkcja zwraca zero. Można zmodyfikować funkcję tak, aby obsługiwała możliwość, że DllGetVersion zwraca strukturę DLLVERSIONINFO2. Jeśli tak, użyj informacji w tym DLLVERSIONINFO2 struktury elementu członkowskiego ullVersion do porównywania wersji, numerów kompilacji i wydań dodatku Service Pack. Makro MAKEDLLVERULL upraszcza zadanie porównywania tych wartości z tymi w ullVersion.

Nuta

Użycie LoadLibrary niepoprawnie może stanowić zagrożenie bezpieczeństwa. Zapoznaj się z dokumentacją LoadLibrary, aby uzyskać informacje na temat prawidłowego ładowania bibliotek DLL z różnymi wersjami systemu Windows.

 

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

Poniższy przykład kodu pokazuje, jak można użyć GetVersion do przetestowania, czy ComCtl32.dll jest w wersji 6.0 lub nowszej.

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

Wersje projektu

Aby upewnić się, że aplikacja jest zgodna z różnymi docelowymi wersjami pliku .dll, makra wersji znajdują się w plikach nagłówków. Te makra służą do definiowania, wykluczania lub ponownego definiowania określonych definicji dla różnych wersji biblioteki DLL. Aby uzyskać szczegółowy opis tych makr, zobacz Using the Windows Headers (Używanie nagłówków systemu Windows).

Na przykład nazwa makra _WIN32_IE jest często spotykana w starszych nagłówkach. Odpowiadasz za zdefiniowanie makra jako liczby szesnastkowej. Ten numer wersji definiuje docelową wersję aplikacji korzystającej z biblioteki DLL. W poniższej tabeli przedstawiono dostępne numery wersji i wpływ, jaki ma każda z nich w aplikacji.

Wersja Opis
0x0300 Aplikacja jest zgodna z wersją ComCtl32.dll w wersji 4.70 lub nowszej. Aplikacja nie może zaimplementować funkcji, które zostały dodane po wersji 4.70.
0x0400 Aplikacja jest zgodna z wersją ComCtl32.dll w wersji 4.71 lub nowszej. Aplikacja nie może zaimplementować funkcji, które zostały dodane po wersji 4.71.
0x0401 Aplikacja jest zgodna z wersją ComCtl32.dll w wersji 4.72 lub nowszej. Aplikacja nie może zaimplementować funkcji, które zostały dodane po wersji 4.72.
0x0500 Aplikacja jest zgodna z wersją ComCtl32.dll w wersji 5.80 lub nowszej. Aplikacja nie może zaimplementować funkcji, które zostały dodane po wersji 5.80.
0x0501 Aplikacja jest zgodna z wersją ComCtl32.dll w wersji 5.81 lub nowszej. Aplikacja nie może zaimplementować funkcji, które zostały dodane po wersji 5.81.
0x0600 Aplikacja jest zgodna z wersją ComCtl32.dll w wersji 6.0 lub nowszej. Aplikacja nie może zaimplementować funkcji, które zostały dodane po wersji 6.0.

 

Jeśli nie zdefiniujesz makra _WIN32_IE w projekcie, zostanie ono automatycznie zdefiniowane jako 0x0500. Aby zdefiniować inną wartość, możesz dodać następujące elementy do dyrektyw kompilatora w pliku make; zastąp żądany numer wersji 0x0400.

/D _WIN32_IE=0x0400

Inną metodą jest dodanie wiersza podobnego do poniższego w kodzie źródłowym przed dołączeniem plików nagłówka powłoki. Zastąp żądany numer wersji 0x0400.

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

o typowych kontrolkach