Versioni di controllo comuni

In questo argomento vengono elencate le versioni disponibili della libreria di controlli comuni (ComCtl32.dll), viene descritto come identificare la versione usata dall'applicazione e viene illustrato come specificare come usare l'applicazione per una versione specifica.

Questo argomento include le sezioni seguenti.

Numeri delle versioni DLL di controllo comuni

Il supporto per i controlli comuni è fornito da ComCtl32.dll, incluse tutte le versioni a 32 bit e a 64 bit di Windows. Ogni versione successiva della DLL supporta le funzionalità e l'API delle versioni precedenti e aggiunge nuove funzionalità.

Poiché diverse versioni di ComCtl32.dll sono state distribuite con Internet Explorer, la versione attiva è talvolta diversa dalla versione fornita con il sistema operativo. Pertanto, l'applicazione deve determinare direttamente quale versione di ComCtl32.dll è presente.

Nella documentazione di riferimento sui controlli comuni molti elementi di programmazione specificano un numero di versione dll minimo supportato. Questo numero di versione indica che l'elemento di programmazione viene implementato in tale versione e nelle versioni successive della DLL, se non diversamente specificato. Se non viene specificato alcun numero di versione, l'elemento di programmazione viene implementato in tutte le versioni esistenti della DLL.

Nella tabella seguente vengono descritte le diverse versioni della DLL e il modo in cui sono state distribuite nei sistemi operativi supportati.

ComCtl32.dll

Versione

Piattaforma di distribuzione

5.81

Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 e Microsoft Internet Explorer 6

5,82

Windows Server 2003, Windows Vista, Windows Server 2008 e Windows 7

6.0

Windows Server 2003

6.10

Windows Vista, Windows Server 2008 e Windows 7

 

Dimensioni della struttura per versioni di controlli comuni diverse

Miglioramenti continui ai controlli comuni hanno portato alla necessità di estendere molte delle strutture. Per questo motivo, le dimensioni delle strutture sono cambiate tra versioni diverse di Commctrl.h. Poiché la maggior parte delle strutture di controllo comuni accetta una dimensione della struttura come uno dei parametri, un messaggio o una funzione può non riuscire se le dimensioni non sono riconosciute. Per risolvere questo problema, le costanti delle dimensioni della struttura sono state definite per facilitare la definizione di una versione diversa di ComCtl32.dll. Nell'elenco seguente vengono definite le costanti delle dimensioni della struttura.

Costante Dimensioni struttura Definizione
HDITEM_V1_SIZE Dimensioni della struttura HDITEM nella versione 4.0.
IMAGELISTDRAWPARAMS_V3_SIZE Dimensioni della struttura IMAGELISTDRAWPARAMS nella versione 5.9.
LVCOLUMN_V1_SIZE Dimensioni della struttura LVCOLUMN nella versione 4.0.
LVGROUP_V5_SIZE Dimensioni della struttura LVGROUP nella versione 6.0.
LVHITTESTINFO_V1_SIZE Dimensioni della struttura LVHITTESTINFO nella versione 4.0.
LVITEM_V1_SIZE Dimensioni della struttura LVITEM nella versione 4.0.
LVITEM_V5_SIZE Dimensioni della struttura LVITEM nella versione 6.0.
LVTILEINFO_V5_SIZE Dimensioni della struttura LVTILEINFO nella versione 6.0.
MCHITTESTINFO_V1_SIZE Dimensioni della struttura MCHITTESTINFO nella versione 4.0.
NMLVCUSTOMDRAW_V3_SIZE Dimensioni della struttura NMLVCUSTOMDRAW nella versione 4.7.
NMTTDISPINFO_V1_SIZE Dimensioni della struttura NMTTDISPINFO nella versione 4.0.
NMTVCUSTOMDRAW_V3_SIZE Dimensioni della struttura NMTVCUSTOMDRAW nella versione 4.7.
PROPSH edizione EnterpriseTHEADER_V1_SIZE Dimensioni della struttura PROPSH edizione Enterprise THEADER nella versione 4.0.
PROPSH edizione EnterpriseTPAGE_V1_SIZE Dimensioni della struttura PROPSH edizione Enterprise TPAGE nella versione 4.0.
REBARBANDINFO_V3_SIZE Dimensioni della struttura REBARBANDINFO nella versione 4.7.
REBARBANDINFO_V6_SIZE Dimensioni della struttura REBARBANDINFO nella versione 6.0.
TTTOOLINFO_V1_SIZE Dimensioni della struttura TOOLINFO nella versione 4.0.
TTTOOLINFO_V2_SIZE Dimensioni della struttura TOOLINFO nella versione 4.7.
TTTOOLINFO_V3_SIZE Dimensioni della struttura TOOLINFO nella versione 6.0.
TVIN edizione StandardRTSTRUCT_V1_SIZE Dimensioni della struttura TVIN edizione Standard RTSTRUCT nella versione 4.0.

 

Uso di DllGetVersion per determinare il numero di versione

La funzione DllGetVersion può essere chiamata da un'applicazione per determinare quale versione della DLL è presente nel sistema.

DllGetVersion restituisce una struttura DLLVERSIONINFO2 . Oltre alle informazioni fornite tramite DLLVERSIONINFO, DLLVERSIONINFO2 fornisce anche il numero di hotfix che identifica il Service Pack installato più recente, che offre un modo più affidabile per confrontare i numeri di versione. Poiché il primo membro di DLLVERSIONINFO2 è una struttura DLLVERSIONINFO , la struttura successiva è compatibile con le versioni precedenti.

La funzione GetVersion di esempio seguente carica una DLL specificata e tenta di chiamare la relativa funzione DllGetVersion . In caso di esito positivo, usa una macro per comprimere i numeri di versione principale e secondaria della struttura DLLVERSIONINFO in un DWORD restituito all'applicazione chiamante. Se la DLL non esporta DllGetVersion, la funzione restituisce zero. È possibile modificare la funzione per gestire la possibilità che DllGetVersion restituisca una struttura DLLVERSIONINFO2 . In tal caso, usare le informazioni contenute nel membro ullVersion della struttura DLLVERSIONINFO2 per confrontare versioni, numeri di build e versioni del Service Pack. La macro MAKEDLLVERULL semplifica l'attività di confronto di questi valori con quelli in ullVersion.

Nota

L'uso di LoadLibrary in modo errato può comportare rischi per la sicurezza. Per informazioni su come caricare correttamente le DLL con versioni diverse di Windows, vedere la documentazione di 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;
}

Nell'esempio di codice seguente viene illustrato come usare GetVersion per verificare se ComCtl32.dll è la versione 6.0 o successiva.

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

Versioni del progetto

Per assicurarsi che l'applicazione sia compatibile con versioni diverse di un file di .dll, le macro di versione sono presenti nei file di intestazione. Queste macro vengono usate per definire, escludere o ridefinire determinate definizioni per versioni diverse della DLL. Per una descrizione approfondita di queste macro, vedi Uso delle intestazioni di Windows.

Ad esempio, il nome della macro _WIN32_IE si trova comunemente nelle intestazioni precedenti. L'utente è responsabile della definizione della macro come numero esadecimale. Questo numero di versione definisce la versione di destinazione dell'applicazione che usa la DLL. Nella tabella seguente vengono illustrati i numeri di versione disponibili e l'effetto che ognuno ha sull'applicazione.

Versione Descrizione
0x0300 L'applicazione è compatibile con ComCtl32.dll versione 4.70 e successive. L'applicazione non può implementare funzionalità aggiunte dopo la versione 4.70.
0x0400 L'applicazione è compatibile con ComCtl32.dll versione 4.71 e successive. L'applicazione non può implementare funzionalità aggiunte dopo la versione 4.71.
0x0401 L'applicazione è compatibile con ComCtl32.dll versione 4.72 e successive. L'applicazione non può implementare funzionalità aggiunte dopo la versione 4.72.
0x0500 L'applicazione è compatibile con ComCtl32.dll versione 5.80 e successive. L'applicazione non può implementare funzionalità aggiunte dopo la versione 5.80.
0x0501 L'applicazione è compatibile con ComCtl32.dll versione 5.81 e successive. L'applicazione non può implementare funzionalità aggiunte dopo la versione 5.81.
0x0600 L'applicazione è compatibile con ComCtl32.dll versione 6.0 e successive. L'applicazione non può implementare funzionalità aggiunte dopo la versione 6.0.

 

Se non si definisce la macro _WIN32_IE nel progetto, viene definita automaticamente come 0x0500. Per definire un valore diverso, è possibile aggiungere quanto segue alle direttive del compilatore nel file make; sostituire il numero di versione desiderato per 0x0400.

/D _WIN32_IE=0x0400

Un altro metodo consiste nell'aggiungere una riga simile alla seguente nel codice sorgente prima di includere i file di intestazione shell. Sostituire il numero di versione desiderato per 0x0400.

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

Informazioni sui controlli comuni