공용 컨트롤 버전

이 항목에서는 사용 가능한 공용 컨트롤 라이브러리(ComCtl32.dll) 버전을 나열하고, 애플리케이션에서 사용 중인 버전을 식별하는 방법을 설명하고, 애플리케이션을 특정 버전으로 지정하는 방법을 설명합니다.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.

공용 컨트롤 DLL 버전 번호

공용 컨트롤에 대한 지원은 Windows의 모든 32비트 및 64비트 버전에 포함된 ComCtl32.dll에서 제공됩니다. DLL의 각 연속 버전은 이전 버전의 기능과 API를 지원하고 새로운 기능을 추가합니다.

다양한 버전의 ComCtl32.dll이 Internet Explorer와 함께 배포되었기 때문에 활성화된 버전이 운영 체제와 함께 제공된 버전과 다른 경우가 있습니다. 따라서 애플리케이션은 어떤 버전의 ComCtl32.dll이 있는지 직접 확인해야 합니다.

공용 컨트롤 참조 설명서에서 많은 프로그래밍 요소는 지원되는 최소 DLL 버전 번호를 지정합니다. 이 버전 번호는 달리 지정하지 않는 한 프로그래밍 요소가 DLL의 해당 버전 및 후속 버전에서 구현됨을 나타냅니다. 버전 번호가 지정되지 않은 경우 프로그래밍 요소는 DLL의 모든 기존 버전에서 구현됩니다.

다음 표에는 다양한 DLL 버전과 지원되는 OS에 배포된 방법이 요약되어 있습니다.

ComCtl32.dll

버전

배포 플랫폼

5.81

Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 및 Microsoft Internet Explorer 6

5.82

Windows 서버 2003, Windows Vista, Windows 서버 2008, Windows 7

6.0

Windows Server 2003

6.10

Windows Vista, Windows 서버 2008, Windows 7

 

다른 공용 컨트롤 버전의 구조체 크기

공용 컨트롤에 대한 지속적인 개선으로 인해 많은 구조체를 확장해야 했습니다. 이러한 이유로 Commctrl.h의 서로 다른 버전 사이에서 구조체의 크기가 변경되었습니다. 대부분의 공용 컨트롤 구조체는 구조체 크기를 매개 변수 중 하나로 사용하므로 크기를 인식하지 못하면 메시지나 함수가 실패할 수 있습니다. 이 문제를 해결하기 위해 다른 버전의 ComCtl32.dll을 대상으로 지정하는 데 도움이 되도록 구조체 크기 상수가 정의되었습니다. 다음 목록은 구조체 크기 상수를 정의합니다.

구조체 크기 상수 정의
HDITEM_V1_SIZE 버전 4.0에서 HDITEM 구조체의 크기입니다.
IMAGELISTDRAWPARAMS_V3_SIZE 버전 5.9에서 IMAGELISTDRAWPARAMS 구조체의 크기입니다.
LVCOLUMN_V1_SIZE 버전 4.0에서 LVCOLUMN 구조체의 크기입니다.
LVGROUP_V5_SIZE 버전 6.0에서 LVGROUP 구조체의 크기입니다.
LVHITTESTINFO_V1_SIZE 버전 4.0에서 LVHITTESTINFO 구조체의 크기입니다.
LVITEM_V1_SIZE 버전 4.0에서 LVITEM 구조체의 크기입니다.
LVITEM_V5_SIZE 버전 6.0에서 LVITEM 구조체의 크기입니다.
LVTILEINFO_V5_SIZE 버전 6.0에서 LVTILEINFO 구조체의 크기입니다.
MCHITTESTINFO_V1_SIZE 버전 4.0에서 MCHITTESTINFO 구조체의 크기입니다.
NMLVCUSTOMDRAW_V3_SIZE 버전 4.7에서 NMLVCUSTOMDRAW 구조체의 크기입니다.
NMTTDISPINFO_V1_SIZE 버전 4.0에서 NMTTDISPINFO 구조체의 크기입니다.
NMTVCUSTOMDRAW_V3_SIZE 버전 4.7에서 NMTVCUSTOMDRAW 구조체의 크기입니다.
PROPSHEETHEADER_V1_SIZE 버전 4.0에서 PROPSHEETHEADER 구조체의 크기입니다.
PROPSHEETPAGE_V1_SIZE 버전 4.0에서 PROPSHEETPAGE 구조체의 크기입니다.
REBARBANDINFO_V3_SIZE 버전 4.7에서 REBARBANDINFO 구조체의 크기입니다.
REBARBANDINFO_V6_SIZE 버전 6.0에서 REBARBANDINFO 구조체의 크기입니다.
TTTOOLINFO_V1_SIZE 버전 4.0에서 TOOLINFO 구조체의 크기입니다.
TTTOOLINFO_V2_SIZE 버전 4.7에서 TOOLINFO 구조체의 크기입니다.
TTTOOLINFO_V3_SIZE 버전 6.0에서 TOOLINFO 구조체의 크기입니다.
TVINSERTSTRUCT_V1_SIZE 버전 4.0에서 TVINSERTSTRUCT 구조체의 크기입니다.

 

DllGetVersion을 사용하여 버전 번호 확인

DllGetVersion 함수는 시스템에 있는 DLL 버전을 확인하기 위해 애플리케이션에서 호출할 수 있습니다.

DllGetVersionDLLVERSIONINFO2 구조체를 반환합니다. DLLVERSIONINFO를 통해 제공되는 정보 외에도 DLLVERSIONINFO2는 또한 최신 설치된 서비스 팩을 식별하는 핫픽스 번호를 제공하여 버전 번호를 비교하는 보다 강력한 방법을 제공합니다. DLLVERSIONINFO2의 첫 번째 멤버는 DLLVERSIONINFO 구조체이므로 이후 구조체는 이전 버전과 호환됩니다.

다음 샘플 함수 GetVersion은 지정된 DLL을 로드하고 DllGetVersion 함수 호출을 시도합니다. 성공하면 매크로를 사용하여 DLLVERSIONINFO 구조체의 주 버전 번호와 부 버전 번호를 호출 애플리케이션에 반환되는 DWORD로 압축합니다. DLL이 DllGetVersion을 내보내지 않으면 함수는 0을 반환합니다. DllGetVersionDLLVERSIONINFO2 구조체를 반환할 가능성을 처리하도록 함수를 수정할 수 있습니다. 그렇다면 해당 DLLVERSIONINFO2 구조체의 ullVersion 멤버에 있는 정보를 사용하여 버전, 빌드 번호 및 서비스 팩 릴리스를 비교합니다. MAKEDLLVERULL 매크로는 이러한 값을 ullVersion의 값과 비교하는 작업을 단순화합니다.

참고

LoadLibrary를 잘못 사용하면 보안 위험이 발생할 수 있습니다. 다양한 버전의 Windows에서 DLL을 올바르게 로드하는 방법에 대한 자세한 내용은 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는 일반적으로 이전 헤더에서 발견됩니다. 매크로를 16진수로 정의해야 합니다. 이 버전 번호는 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

또 다른 방법은 Shell 헤더 파일을 포함하기 전에 소스 코드에 다음과 유사한 줄을 추가하는 것입니다. 0x0400을 원하는 버전 번호로 대체합니다.

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

공용 컨트롤 정보