Общие версии элементов управления
В этом разделе перечислены доступные версии библиотеки Common Control (ComCtl32.dll), описано, как определить версию, используемую приложением, и объясняется, как нацелить приложение на определенную версию.
В этом разделе содержатся следующие подразделы.
- Номера версий dll common control
- Размеры структуры для различных версий общих элементов управления
- Использование DllGetVersion для определения номера версии
- Версии проекта
- Связанные темы
Номера версий dll common control
Поддержка общих элементов управления обеспечивается ComCtl32.dll, которые включают все 32-разрядные и 64-разрядные версии Windows. Каждая последующая версия библиотеки DLL поддерживает функции и API более ранних версий и добавляет новые функции.
Так как различные версии ComCtl32.dll распространялись через Интернет Обозреватель, активная версия иногда отличается от версии, поставляемой вместе с операционной системой. Поэтому приложение должно напрямую определять, какая версия ComCtl32.dll присутствует.
В справочной документации по распространенным элементам управления многие программные элементы указывают минимальный поддерживаемый номер версии БИБЛИОТЕКи DLL. Этот номер версии указывает, что программный элемент реализован в этой версии и последующих версиях библиотеки DLL, если не указано иное. Если номер версии не указан, программный элемент реализуется во всех существующих версиях библиотеки DLL.
В следующей таблице описаны различные версии БИБЛИОТЕК DLL и их распространение на поддерживаемых операционных платформах.
Microsoft Internet Обозреватель 5.01, Microsoft Internet Обозреватель 5.5 и Microsoft Internet Обозреватель 6
Windows Server 2003, Windows Vista, Windows Server 2008 и Windows 7
Windows Server 2003
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. В следующей таблице показаны доступные номера версий и влияние каждой из них на приложение.
| Версия | Описание |
|---|---|
| 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
Элементы управления подклассами
Если элемент управления выполняет почти все необходимое, но требуется несколько дополнительных функций, вы можете изменить или добавить функции в исходный элемент управления, создав его подкласс. Подкласс может иметь все функции существующего класса, а также любые дополнительные функции, которые вы хотите предоставить ему.
В этом документе описывается, как создаются подклассы, и рассматриваются следующие разделы.
- Элементы управления подклассами до ComCtl32.dll версии 6
- Хранение данных пользователя
- Недостатки старого подхода к подклассам
- SetWindowSubclass
- GetWindowSubclass
- RemoveWindowSubclass
- DefSubclassProc
Элементы управления подклассами до ComCtl32.dll версии 6
Элемент управления можно поместить в подкласс и сохранить пользовательские данные в элементе управления. Это можно сделать при использовании версий ComCtl32.dll, предшествующих версии 6. Существуют некоторые недостатки при создании подклассов с более ранними версиями ComCtl32.dll.
Чтобы создать новый элемент управления, лучше всего начать с одного из общих элементов управления Windows и расширить его в соответствии с определенными потребностями. Чтобы расширить элемент управления, создайте элемент управления и замените его существующую процедуру окна на новую. Новая процедура перехватывает сообщения элемента управления и либо работает с ними, либо передает их исходной процедуре для обработки по умолчанию. Используйте функцию SetWindowLong или SetWindowLongPtr для замены WNDPROC элемента управления . В следующем примере кода показано, как заменить WNDPROC.
OldWndProc = (WNDPROC)SetWindowLongPtr (hButton, GWLP_WNDPROC, (LONG_PTR)NewWndProc);Хранение данных пользователя
Может потребоваться хранить данные пользователя в отдельном окне. Эти данные могут использоваться процедурой нового окна для определения способа рисования элемента управления или отправки определенных сообщений. Например, данные можно использовать для хранения указателя класса C++ на класс, представляющий элемент управления . В следующем примере кода показано, как использовать SetProp для хранения данных в окне.
SetProp (hwnd, TEXT("MyData"), (HANDLE)pMyData);Недостатки старого подхода к подклассам
В следующем списке перечислены некоторые недостатки использования ранее описанного подхода к подклассам элемента управления.
- Процедуру окна можно заменить только один раз.
- После его создания трудно удалить подкласс.
- Связывание частных данных с окном неэффективно.
- Чтобы вызвать следующую процедуру в цепочке подклассов, нельзя привести старую процедуру окна и вызвать ее. Ее необходимо вызвать с помощью функции CallWindowProc .
Элементы управления подклассами с использованием ComCtl32.dll версии 6
ComCtl32.dll версии 6 используется только Юникод. Общие элементы управления, поддерживаемые ComCtl32.dll версии 6, не должны быть подклассами (или надклассами) с помощью оконных процедур ANSI.
ComCtl32.dll версии 6 содержит четыре функции, которые упрощают создание подклассов и устраняют описанные ранее недостатки. Новые функции инкапсулируют управление, связанное с несколькими наборами эталонных данных, поэтому разработчик может сосредоточиться на функциях программирования, а не на управлении подклассами. Ниже перечислены функции подклассов.
SetWindowSubclass
Эта функция используется для первоначального подкласса окна. Каждый подкласс уникально идентифицируется по адресу pfnSubclass и его uIdSubclass. Оба эти параметра являются параметрами функции SetWindowSubclass . Несколько подклассов могут совместно использовать одну процедуру подкласса, а идентификатор может идентифицировать каждый вызов. Чтобы изменить ссылочные данные, можно выполнить последующие вызовы SetWindowSubclass. Важное преимущество заключается в том, что каждый экземпляр подкласса имеет собственные эталонные данные.
Объявление процедуры подкласса немного отличается от обычной оконной процедуры, так как она содержит два дополнительных фрагмента данных: идентификатор подкласса и ссылочные данные. Это показывают два последних параметра следующего объявления функции.
LRESULT CALLBACK MyWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData);При каждом получении сообщения новой процедурой окна включаются идентификатор подкласса и ссылочные данные.
Все строки, передаваемые в процедуру, являются строками Юникода, даже если Юникод не указан в качестве определения препроцессора.
В следующем примере показана схема реализации процедуры окна для элемента управления с подклассом.
LRESULT CALLBACK OwnerDrawButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) < switch (uMsg) < case WM_PAINT: . . . return TRUE; // Other cases. >return DefSubclassProc(hWnd, uMsg, wParam, lParam); >Процедура window может быть присоединена к элементу управления в обработчике WM_INITDIALOG процедуры диалогового окна, как показано в следующем примере.
case WM_INITDIALOG:
GetWindowSubclass
Эта функция извлекает сведения о подклассе. Например, для доступа к эталонным данным можно использовать GetWindowSubclass .
RemoveWindowSubclass
Эта функция удаляет подклассы. RemoveWindowSubclass в сочетании с SetWindowSubclass позволяет динамически добавлять и удалять подклассы.
DefSubclassProc
Функция DefSubclassProc вызывает следующий обработчик в цепочке подклассов. Функция также извлекает правильные идентификаторы и эталонные данные и передает сведения в процедуру следующего окна.
Обратная связь
Были ли сведения на этой странице полезными?
Common Control Versions
This topic lists the available versions of the Common Control library (ComCtl32.dll), describes how to identify the version that your application is using, and explains how to target your application for a specific version.
This topic contains the following sections.
- Common Control DLL Versions Numbers
- Structure Sizes for Different Common Control Versions
- Using DllGetVersion to Determine the Version Number
- Project Versions
- Related topics
Common Control DLL Versions Numbers
Support for common controls is provided by ComCtl32.dll, which all 32-bit and 64-bit versions of Windows include. Each successive version of the DLL supports the features and API of earlier versions and adds new features.
Because various versions of ComCtl32.dll were distributed with Internet Explorer, the version that is active is sometimes different from the version that was shipped with the operating system. Therefore, your application must directly determine which version of ComCtl32.dll is present.
In the common controls reference documentation, many programming elements specify a minimum supported DLL version number. This version number indicates that the programming element is implemented in that version and subsequent versions of the DLL unless otherwise specified. If no version number is specified, the programming element is implemented in all existing versions of the DLL.
The following table outlines the different DLL versions and how they were distributed on supported OSes.
Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5, and Microsoft Internet Explorer 6
Windows Server 2003, Windows Vista, Windows Server 2008, and Windows 7
Windows Server 2003
Windows Vista, Windows Server 2008, and Windows 7
Structure Sizes for Different Common Control Versions
Ongoing enhancements to common controls have resulted in the need to extend many of the structures. For this reason, the size of the structures has changed between different versions of Commctrl.h. Because most of the common control structures take a structure size as one of the parameters, a message or function can fail if the size is not recognized. To remedy this, structure size constants have been defined to aid in targeting different version of ComCtl32.dll. The following list defines the structure size constants.
Structure Size Constant Definition HDITEM_V1_SIZE The size of the HDITEM structure in version 4.0. IMAGELISTDRAWPARAMS_V3_SIZE The size of the IMAGELISTDRAWPARAMS structure in version 5.9. LVCOLUMN_V1_SIZE The size of the LVCOLUMN structure in version 4.0. LVGROUP_V5_SIZE The size of the LVGROUP structure in version 6.0. LVHITTESTINFO_V1_SIZE The size of the LVHITTESTINFO structure in version 4.0. LVITEM_V1_SIZE The size of the LVITEM structure in version 4.0. LVITEM_V5_SIZE The size of the LVITEM structure in version 6.0. LVTILEINFO_V5_SIZE The size of the LVTILEINFO structure in version 6.0. MCHITTESTINFO_V1_SIZE The size of the MCHITTESTINFO structure in version 4.0. NMLVCUSTOMDRAW_V3_SIZE The size of the NMLVCUSTOMDRAW structure in version 4.7. NMTTDISPINFO_V1_SIZE The size of the NMTTDISPINFO structure in version 4.0. NMTVCUSTOMDRAW_V3_SIZE The size of the NMTVCUSTOMDRAW structure in version 4.7. PROPSHEETHEADER_V1_SIZE The size of the PROPSHEETHEADER structure in version 4.0. PROPSHEETPAGE_V1_SIZE The size of the PROPSHEETPAGE structure in version 4.0. REBARBANDINFO_V3_SIZE The size of the REBARBANDINFO structure in version 4.7. REBARBANDINFO_V6_SIZE The size of the REBARBANDINFO structure in version 6.0. TTTOOLINFO_V1_SIZE The size of the TOOLINFO structure in version 4.0. TTTOOLINFO_V2_SIZE The size of the TOOLINFO structure in version 4.7. TTTOOLINFO_V3_SIZE The size of the TOOLINFO structure in version 6.0. TVINSERTSTRUCT_V1_SIZE The size of the TVINSERTSTRUCT structure in version 4.0. Using DllGetVersion to Determine the Version Number
The DllGetVersion function can be called by an application to determine which DLL version is present on the system.
DllGetVersion returns a DLLVERSIONINFO2 structure. In addition to the information provided through DLLVERSIONINFO, DLLVERSIONINFO2 also provides the hotfix number that identifies the latest installed service pack, which provides a more robust way to compare version numbers. Because the first member of DLLVERSIONINFO2 is a DLLVERSIONINFO structure, the later structure is backward-compatible.
The following sample function GetVersion loads a specified DLL and attempts to call its DllGetVersion function. If successful, it uses a macro to pack the major and minor version numbers from the DLLVERSIONINFO structure into a DWORD that is returned to the calling application. If the DLL does not export DllGetVersion, the function returns zero. You can modify the function to handle the possibility that DllGetVersion returns a DLLVERSIONINFO2 structure. If so, use the information in that DLLVERSIONINFO2 structure’s ullVersion member to compare versions, build numbers, and service pack releases. The MAKEDLLVERULL macro simplifies the task of comparing these values to those in ullVersion.
Using LoadLibrary incorrectly can pose security risks. Refer to the LoadLibrary documentation for information on how to correctly load DLLs with different versions of 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; >The following code example shows how you can use GetVersion to test whether ComCtl32.dll is version 6.0 or later.
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. >Project Versions
To ensure that your application is compatible with different targeted versions of a .dll file, version macros are present in the header files. These macros are used to define, exclude, or redefine certain definitions for different versions of the DLL. See Using the Windows Headers for an in-depth description of these macros.
For example, the macro name _WIN32_IE is commonly found in older headers. You are responsible for defining the macro as a hexadecimal number. This version number defines the target version of the application that is using the DLL. The following table shows the available version numbers and the effect each has on your application.
Version Description 0x0300 The application is compatible with ComCtl32.dll version 4.70 and later. The application cannot implement features that were added after version 4.70. 0x0400 The application is compatible with ComCtl32.dll version 4.71 and later. The application cannot implement features that were added after version 4.71. 0x0401 The application is compatible with ComCtl32.dll version 4.72 and later. The application cannot implement features that were added after version 4.72. 0x0500 The application is compatible with ComCtl32.dll version 5.80 and later. The application cannot implement features that were added after version 5.80. 0x0501 The application is compatible with ComCtl32.dll version 5.81 and later. The application cannot implement features that were added after version 5.81. 0x0600 The application is compatible with ComCtl32.dll version 6.0 and later. The application cannot implement features that were added after version 6.0. If you do not define the _WIN32_IE macro in your project, it is automatically defined as 0x0500. To define a different value, you can add the following to the compiler directives in your make file; substitute the desired version number for 0x0400.
/D _WIN32_IE=0x0400Another method is to add a line similar to the following in your source code before you include the Shell header files. Substitute the desired version number for 0x0400.
#define _WIN32_IE 0x0400 #include
У вас большие запросы!
Точнее, от вашего браузера их поступает слишком много, и сервер VK забил тревогу.
Эта страница была загружена по HTTP, вместо безопасного HTTPS, а значит телепортации обратно не будет.
Обратитесь в поддержку сервиса.Вы отключили сохранение Cookies, а они нужны, чтобы решить проблему.
Почему-то страница не получила всех данных, а без них она не работает.
Обратитесь в поддержку сервиса.Вы вернётесь на предыдущую страницу через 5 секунд.
Вернуться назад