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