Поделиться через


Общие версии элементов управления

В этом разделе перечислены доступные версии библиотеки Common Control (ComCtl32.dll), описывается, как определить версию, используемую приложением, и объясняется, как нацелиться на приложение для конкретной версии.

В этом разделе содержатся следующие разделы.

Номера версий библиотеки DLL для общих элементов управления

Поддержка общих элементов управления предоставляется ComCtl32.dll, которые включают все 32-разрядные и 64-разрядные версии Windows. Каждая последовательная версия библиотеки DLL поддерживает функции и API более ранних версий и добавляет новые функции.

Так как различные версии ComCtl32.dll были распределены с Помощью Internet Explorer, версия, активная иногда отличается от версии, поставляемой с операционной системой. Поэтому приложение должно напрямую определить, какая версия ComCtl32.dll присутствует.

В справочной документации по общим элементам управления многие элементы программирования указывают минимальный поддерживаемый номер версии DLL. Этот номер версии указывает, что элемент программирования реализуется в этой версии и последующих версиях библиотеки DLL, если иное не указано. Если номер версии не указан, элемент программирования реализуется во всех существующих версиях библиотеки DLL.

В следующей таблице описаны различные версии БИБЛИОТЕК DLL и их распределение в поддерживаемых операционных службах.

ComCtl32.dll

Версия

Платформа распространения

5.81

Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 и Microsoft Internet Explorer 6

5.82

Windows Server 2003, Windows Vista, Windows Server 2008 и Windows 7

6.0

Windows Server 2003

6.10

Windows Vista, Windows Server 2008 и Windows 7

 

Размеры структуры для разных версий общих элементов управления

Продолжающиеся улучшения общих элементов управления привели к необходимости расширения многих структур. По этой причине размер структур изменился между разными версиями Commctrl.h. Поскольку большинство распространенных структур управления принимают размер структуры в качестве одного из параметров, сообщение или функция могут завершиться ошибкой, если размер не распознается. Чтобы устранить эту проблему, константы размера структуры были определены для оказания помощи в выборе различных версий ComCtl32.dll. В следующем списке определяются константы размера структуры.

Константы размера структуры Определение
HDITEM_V1_SIZE Размер структуры HDITEM версии 4.0.
IMAGELISTDRAWPARAMS_V3_SIZE Размер структуры IMAGELISTDRAWPARAMS версии 5.9.
LVCOLUMN_V1_SIZE Размер структурыLVCOLUMN в версии 4.0.
LVGROUP_V5_SIZE Размер структуры LVGROUP в версии 6.0.
LVHITTESTINFO_V1_SIZE Размер структурыLVHITTESTINFO в версии 4.0.
LVITEM_V1_SIZE Размер структуры LVITEM версии 4.0.
LVITEM_V5_SIZE Размер структуры LVITEM версии 6.0.
LVTILEINFO_V5_SIZE Размер структурыLVTILEINFOверсии 6.0.
MCHITTESTINFO_V1_SIZE Размер структуры MCHITTESTINFO версии 4.0.
NMLVCUSTOMDRAW_V3_SIZE Размер структуры NMLVCUSTOMDRAW версии 4.7.
NMTTDISPINFO_V1_SIZE Размер структуры NMTTDISPINFO в версии 4.0.
NMTVCUSTOMDRAW_V3_SIZE Размер структуры NMTVCUSTOMDRAW в версии 4.7.
PROPSHEETHEADER_V1_SIZE Размер структуры PROPSHEETHEADER в версии 4.0.
PROPSHEETPAGE_V1_SIZE Размер структуры PROPSHEETPAGE в версии 4.0.
REBARBANDINFO_V3_SIZE Размер структуры REBARBANDINFO в версии 4.7.
REBARBANDINFO_V6_SIZE Размер структуры REBARBANDINFO в версии 6.0.
TTTOOLINFO_V1_SIZE Размер структуры TOOLINFO версии 4.0.
TTTOOLINFO_V2_SIZE Размер структуры TOOLINFO версии 4.7.
TTTOOLINFO_V3_SIZE Размер структуры TOOLINFO версии 6.0.
TVINSERTSTRUCT_V1_SIZE Размер структуры TVINSERTSTRUCT в версии 4.0.

 

Использование DllGetVersion для определения номера версии

Функцию DllGetVersion можно вызвать приложением, чтобы определить, какая версия DLL присутствует в системе.

DllGetVersion возвращает структуру DLLVERSIONINFO2. Помимо сведений, предоставленных DLLVERSIONINFO, DLLVERSIONINFO2 также предоставляет номер исправления, определяющий последний установленный пакет обновления, который обеспечивает более надежный способ сравнения номеров версий. Так как первый элемент DLLVERSIONINFO2 является структурой DLLVERSIONINFO, то более поздняя структура является обратно совместимой.

Следующая пример функции GetVersion загружает указанную библиотеку DLL и пытается вызвать ее функцию DllGetVersion. В случае успешного выполнения макрос используется для упаковки основных и дополнительных номеров версий из структуры DLLVERSIONINFO в DWORD, возвращаемой вызывающему приложению. Если библиотека DLL не экспортирует DllGetVersion, функция возвращает ноль. Вы можете изменить функцию для обработки возможности, что DllGetVersion возвращает структуру DLLVERSIONINFO2. Если да, используйте сведения в этой DLLVERSIONINFO2 структуре ullVersion для сравнения версий, номеров сборки и выпусков пакета обновления. Макрос MAKEDLLVERULL упрощает задачу сравнения этих значений с этими значениями в ullVersion.

Заметка

Использование LoadLibrary неправильно может представлять угрозу безопасности. Сведения о том, как правильно загружать библиотеки DLL с различными версиями Windows, см. в документации по 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;
}

В следующем примере кода показано, как использовать GetVersion для проверки того, является ли ComCtl32.dll версия 6.0 или более поздней.

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

Версии проекта

Чтобы обеспечить совместимость приложения с различными целевыми версиями файла .dll, макросы версий присутствуют в файлах заголовков. Эти макросы используются для определения, исключения или переопределиния определенных определений для разных версий библиотеки DLL. Дополнительные сведения об этих макросах см. в использовании заголовков Windows.

Например, имя макроса _WIN32_IE обычно встречается в старых заголовках. Вы несете ответственность за определение макроса в виде шестнадцатеричного числа. Этот номер версии определяет целевую версию приложения, использующую библиотеку DLL. В следующей таблице показаны доступные номера версий и влияние каждого из них на приложение.

Версия Описание
0x0300 Приложение совместимо с ComCtl32.dll версии 4.70 и более поздними версиями. Приложение не может реализовать функции, добавленные после версии 4.70.
0x0400 Приложение совместимо с ComCtl32.dll версии 4.71 и более поздней. Приложение не может реализовать функции, добавленные после версии 4.71.
0x0401 Приложение совместимо с ComCtl32.dll версии 4.72 и более поздней. Приложение не может реализовать функции, добавленные после версии 4.72.
0x0500 Приложение совместимо с ComCtl32.dll версии 5.80 и более поздней. Приложение не может реализовать функции, добавленные после версии 5.80.
0x0501 Приложение совместимо с ComCtl32.dll версии 5.81 и более поздней. Приложение не может реализовать функции, добавленные после версии 5.81.
0x0600 Приложение совместимо с ComCtl32.dll версии 6.0 и более поздней. Приложение не может реализовать функции, добавленные после версии 6.0.

 

Если макрос _WIN32_IE в проекте не определен, он автоматически определяется как 0x0500. Чтобы определить другое значение, можно добавить следующее в директивы компилятора в файле make; замените нужный номер версии для 0x0400.

/D _WIN32_IE=0x0400

Другой метод — добавить строку, аналогичную приведенной ниже в исходном коде, прежде чем включать файлы заголовков Оболочки. Замените нужный номер версии 0x0400.

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

о распространенных элементах управления