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


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

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

Эта тема описана в следующих разделах.

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

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

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

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

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

ComCtl32.dll

Версия

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

5.81

Microsoft Internet Обозреватель 5.01, Microsoft Internet Обозреватель 5.5 и Microsoft Internet Обозреватель 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 структуры. Если да, используйте сведения в этом элементе ullVersion структуры DLLVERSIONINFO2 для сравнения версий, номеров сборок и выпусков пакетов обновления. Макрос 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. В следующей таблице показаны доступные номера версий и влияние каждого из них на приложение.

Версия Description
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>

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