Общие версии элементов управления
В этом разделе перечислены доступные версии библиотеки Common Control (ComCtl32.dll), описано, как определить версию, используемую приложением, и объяснить, как нацеливать приложение на определенную версию.
Эта тема описана в следующих разделах.
- Номера версий библиотеки DLL для общих элементов управления
- Размеры структуры для разных версий общих элементов управления
- Использование DllGetVersion для определения номера версии
- Версии проекта
- Связанные статьи
Номера версий библиотеки 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>
См. также