Condividi tramite


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 impostare come destinazione l'applicazione per una versione specifica.

Questo argomento contiene le sezioni seguenti.

Numeri delle versioni DLL di controllo comuni

Il supporto per i controlli comuni è fornito da ComCtl32.dll, che includono 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 destinazione 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 strutturaHDITEM nella versione 4.0.
IMAGELISTDRAWPARAMS_V3_SIZE Dimensioni della struttura di IMAGELISTDRAWPARAMS nella versione 5.9.
LVCOLUMN_V1_SIZE Dimensioni della strutturaLVCOLUMN nella versione 4.0.
LVGROUP_V5_SIZE Dimensioni della struttura LVGROUP nella versione 6.0.
LVHITTESTINFO_V1_SIZE Dimensioni della strutturaLVHITTESTINFOnella versione 4.0.
LVITEM_V1_SIZE Dimensione della struttura LVITEM nella versione 4.0.
LVITEM_V5_SIZE Dimensioni della strutturaLVITEM nella versione 6.0.
LVTILEINFO_V5_SIZE Dimensioni della strutturaLVTILEINFOnella versione 6.0.
MCHITTESTINFO_V1_SIZE Dimensioni della strutturaMCHITTESTINFO 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 strutturaNMTVCUSTOMDRAWnella versione 4.7.
PROPSHEETHEADER_V1_SIZE Dimensione della struttura PROPSHEETHEADER nella versione 4.0.
PROPSHEETPAGE_V1_SIZE Dimensioni della struttura PROPSHEETPAGE nella versione 4.0.
REBARBANDINFO_V3_SIZE Dimensioni della strutturaREBARBANDINFO nella versione 4.7.
REBARBANDINFO_V6_SIZE Dimensioni della strutturaREBARBANDINFO nella versione 6.0.
TTTOOLINFO_V1_SIZE Dimensioni della strutturaTOOLINFO nella versione 4.0.
TTTOOLINFO_V2_SIZE Dimensioni della strutturaTOOLINFO nella versione 4.7.
TTTOOLINFO_V3_SIZE Dimensioni della strutturaTOOLINFO nella versione 6.0.
TVINSERTSTRUCT_V1_SIZE Dimensioni della struttura TVINSERTSTRUCT nella versione 4.0.

 

Uso di DllGetVersion per determinare il numero di versione

La funzioneDllGetVersionpuò 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 di esempio seguente GetVersion 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 strutturaDLLVERSIONINFOin 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 in tale DLLVERSIONINFO2 struttura membro ullVersion per confrontare versioni, numeri di build e versioni del Service Pack. La macro MAKEDLLVERULL semplifica l'attività di confronto di questi valori con quelli presenti in ullVersion.

Nota

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