Versiones de control comunes

En este tema se enumeran las versiones disponibles de la biblioteca de control común (ComCtl32.dll), se describe cómo identificar la versión que usa la aplicación y se explica cómo dirigirse a la aplicación para una versión específica.

En este tema se incluyen las siguientes secciones.

Números de versiones de DLL de control comunes

La compatibilidad con controles comunes se proporciona mediante ComCtl32.dll, que incluyen todas las versiones de 32 y 64 bits de Windows. Cada versión sucesiva del archivo DLL admite las características y la API de versiones anteriores y agrega nuevas características.

Dado que varias versiones de ComCtl32.dll se distribuyeron con Internet Explorer, la versión que está activa a veces es diferente de la versión que se envió con el sistema operativo. Por lo tanto, la aplicación debe determinar directamente qué versión de ComCtl32.dll está presente.

En la documentación de referencia de controles comunes, muchos elementos de programación especifican un número de versión de DLL mínimo admitido. Este número de versión indica que el elemento de programación se implementa en esa versión y versiones posteriores del archivo DLL, a menos que se especifique lo contrario. Si no se especifica ningún número de versión, el elemento de programación se implementa en todas las versiones existentes del archivo DLL.

En la tabla siguiente se describen las distintas versiones dll y cómo se distribuyeron en los sistemas operativos compatibles.

ComCtl32.dll

Versión

Plataforma de distribución

5.81

Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 y Microsoft Internet Explorer 6

5.82

Windows Server 2003, Windows Vista, Windows Server 2008 y Windows 7

6,0

Windows Server 2003

6.10

Windows Vista, Windows Server 2008 y Windows 7

 

Tamaños de estructura para diferentes versiones de control comunes

Las mejoras continuas en los controles comunes han dado lugar a la necesidad de ampliar muchas de las estructuras. Por este motivo, el tamaño de las estructuras ha cambiado entre diferentes versiones de Commctrl.h. Dado que la mayoría de las estructuras de control comunes toman un tamaño de estructura como uno de los parámetros, un mensaje o función puede producir un error si no se reconoce el tamaño. Para solucionar esto, las constantes de tamaño de estructura se han definido para ayudar en la selección de diferentes versiones de ComCtl32.dll. En la lista siguiente se definen las constantes de tamaño de estructura.

Constante de tamaño de estructura Definición
HDITEM_V1_SIZE Tamaño de la estructura HDITEM en la versión 4.0.
IMAGELISTDRAWPARAMS_V3_SIZE Tamaño de la estructura IMAGELISTDRAWPARAMS en la versión 5.9.
LVCOLUMN_V1_SIZE Tamaño de la estructura LVCOLUMN en la versión 4.0.
LVGROUP_V5_SIZE Tamaño de la estructura LVGROUP en la versión 6.0.
LVHITTESTINFO_V1_SIZE Tamaño de la estructura LVHITTESTINFO en la versión 4.0.
LVITEM_V1_SIZE Tamaño de la estructura LVITEM en la versión 4.0.
LVITEM_V5_SIZE Tamaño de la estructura LVITEM en la versión 6.0.
LVTILEINFO_V5_SIZE Tamaño de la estructura LVTILEINFO en la versión 6.0.
MCHITTESTINFO_V1_SIZE Tamaño de la estructura MCHITTESTINFO en la versión 4.0.
NMLVCUSTOMDRAW_V3_SIZE Tamaño de la estructura NMLVCUSTOMDRAW en la versión 4.7.
NMTTDISPINFO_V1_SIZE Tamaño de la estructura NMTTDISPINFO en la versión 4.0.
NMTVCUSTOMDRAW_V3_SIZE Tamaño de la estructura NMTVCUSTOMDRAW en la versión 4.7.
PROPSHEETHEADER_V1_SIZE Tamaño de la estructura PROPSHEETHEADER en la versión 4.0.
PROPSHEETPAGE_V1_SIZE Tamaño de la estructura PROPSHEETPAGE en la versión 4.0.
REBARBANDINFO_V3_SIZE Tamaño de la estructura REBARBANDINFO en la versión 4.7.
REBARBANDINFO_V6_SIZE Tamaño de la estructura REBARBANDINFO en la versión 6.0.
TTTOOLINFO_V1_SIZE Tamaño de la estructura TOOLINFO en la versión 4.0.
TTTOOLINFO_V2_SIZE Tamaño de la estructura TOOLINFO en la versión 4.7.
TTTOOLINFO_V3_SIZE Tamaño de la estructura TOOLINFO en la versión 6.0.
TVINSERTSTRUCT_V1_SIZE Tamaño de la estructura TVINSERTSTRUCT en la versión 4.0.

 

Usar DllGetVersion para determinar el número de versión

Una aplicación puede llamar a la función DllGetVersion para determinar qué versión de DLL está presente en el sistema.

DllGetVersion devuelve una estructura DLLVERSIONINFO2 . Además de la información proporcionada a través de DLLVERSIONINFO, DLLVERSIONINFO2 también proporciona el número de revisión que identifica el Service Pack instalado más reciente, lo que proporciona una manera más sólida de comparar números de versión. Dado que el primer miembro de DLLVERSIONINFO2 es una estructura DLLVERSIONINFO , la estructura posterior es compatible con versiones anteriores.

La siguiente función GetVersion de ejemplo carga un archivo DLL especificado e intenta llamar a su función DllGetVersion . Si se ejecuta correctamente, usa una macro para empaquetar los números de versión principal y secundaria de la estructura DLLVERSIONINFO en un DWORD que se devuelve a la aplicación que realiza la llamada. Si el archivo DLL no exporta DllGetVersion, la función devuelve cero. Puede modificar la función para controlar la posibilidad de que DllGetVersion devuelva una estructura DLLVERSIONINFO2 . Si es así, use la información del miembro ullVersion de esa estructura DLLVERSION2 para comparar versiones, números de compilación y versiones de Service Pack. La macro MAKEDLLVERULL simplifica la tarea de comparar estos valores con los de ullVersion.

Nota

El uso incorrecto de LoadLibrary puede suponer riesgos de seguridad. Consulte la documentación de LoadLibrary para obtener información sobre cómo cargar correctamente archivos DLL con diferentes versiones de 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;
}

En el ejemplo de código siguiente se muestra cómo se puede usar GetVersion para probar si ComCtl32.dll es la versión 6.0 o posterior.

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

Versiones del proyecto

Para asegurarse de que la aplicación es compatible con diferentes versiones de destino de un archivo .dll, las macros de versión están presentes en los archivos de encabezado. Estas macros se usan para definir, excluir o redefinir determinadas definiciones para distintas versiones del archivo DLL. Consulte Uso de los encabezados de Windows para obtener una descripción detallada de estas macros.

Por ejemplo, el nombre de la macro _WIN32_IE se encuentra normalmente en encabezados antiguos. Es responsable de definir la macro como un número hexadecimal. Este número de versión define la versión de destino de la aplicación que usa el archivo DLL. En la tabla siguiente se muestran los números de versión disponibles y el efecto que tiene cada uno en la aplicación.

Versión Descripción
0x0300 La aplicación es compatible con ComCtl32.dll versión 4.70 y posteriores. La aplicación no puede implementar características que se agregaron después de la versión 4.70.
0x0400 La aplicación es compatible con ComCtl32.dll versión 4.71 y posteriores. La aplicación no puede implementar características que se agregaron después de la versión 4.71.
0x0401 La aplicación es compatible con ComCtl32.dll versión 4.72 y posteriores. La aplicación no puede implementar características que se agregaron después de la versión 4.72.
0x0500 La aplicación es compatible con ComCtl32.dll versión 5.80 y posteriores. La aplicación no puede implementar características que se agregaron después de la versión 5.80.
0x0501 La aplicación es compatible con ComCtl32.dll versión 5.81 y posteriores. La aplicación no puede implementar características que se agregaron después de la versión 5.81.
0x0600 La aplicación es compatible con ComCtl32.dll versión 6.0 y posteriores. La aplicación no puede implementar características que se agregaron después de la versión 6.0.

 

Si no define la macro _WIN32_IE en el proyecto, se define automáticamente como 0x0500. Para definir un valor diferente, puede agregar lo siguiente a las directivas del compilador en el archivo make; sustituya el número de versión deseado por 0x0400.

/D _WIN32_IE=0x0400

Otro método consiste en agregar una línea similar a la siguiente en el código fuente antes de incluir los archivos de encabezado de Shell. Sustituya el número de versión deseado por 0x0400.

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

Acerca de los controles comunes