공용 컨트롤 버전

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

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

공용 제어 DLL 버전 번호

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

다양한 버전의 ComCtl32.dll Internet Explorer 함께 배포되었으므로 활성 버전이 운영 체제와 함께 제공된 버전과 다른 경우도 있습니다. 따라서 애플리케이션은 ComCtl32.dll 버전을 직접 결정해야 합니다.

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

다음 표에서는 다양한 DLL 버전과 지원되는 OSes에 배포된 방법을 간략하게 설명합니다.

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 _ 크기 버전 4.0의 HDITEM 구조체 크기입니다.
IMAGELISTDRAWPARAMS _ V3 _ 크기 버전 5.9의 IMAGELISTDRAWPARAMS 구조체 크기입니다.
LVCOLUMN _ V1 _ 크기 버전 4.0의 LVCOLUMN 구조체 크기입니다.
LVGROUP _ V5 _ 크기 버전 6.0의 LVGROUP 구조체 크기입니다.
LVHIT 한정자FO _ V1 _ 크기 버전 4.0의 LVHIT SIZEFO 구조체 크기입니다.
LVITEM _ V1 _ 크기 버전 4.0의 LVITEM 구조체 크기입니다.
LVITEM _ V5 _ 크기 버전 6.0의 LVITEM 구조체 크기입니다.
LVTILEINFO _ V5 _ 크기 버전 6.0의 LVTILEINFO 구조체 크기입니다.
MCHIT SIZE _ V1 _ SIZE 버전 4.0의 MCHITCHIFO 구조체 크기입니다.
NMLVCUSTOMDRAW _ V3 _ 크기 버전 4.7의 NMLVCUSTOMDRAW 구조체 크기입니다.
NMTTDISPINFO _ V1 _ 크기 버전 4.0의 NMTTDISPINFO 구조체 크기입니다.
NMTVCUSTOMDRAW _ V3 _ 크기 버전 4.7의 NMTVCUSTOMDRAW 구조체 크기입니다.
PROPSHEETHEADER _ V1 _ 크기 버전 4.0의 PROPSHEETHEADER 구조체 크기입니다.
PROPSHEETPAGE _ V1 _ 크기 버전 4.0의 PROPSHEETPAGE 구조체 크기입니다.
REBARBANDINFO _ V3 _ 크기 버전 4.7의 REBARBANDINFO 구조체 크기입니다.
REBARBANDINFO _ V6 _ 크기 버전 6.0의 REBARBANDINFO 구조체 크기입니다.
TTTOOLINFO _ V1 _ 크기 버전 4.0의 TOOLINFO 구조체 크기입니다.
TTTOOLINFO _ V2 _ 크기 버전 4.7의 TOOLINFO 구조체 크기입니다.
TTTOOLINFO _ V3 _ 크기 버전 6.0의 TOOLINFO 구조체 크기입니다.
TVINSERTSTRUCT _ V1 _ SIZE 버전 4.0의 TVINSERTSTRUCT 구조체 크기입니다.

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

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

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

다음 샘플 함수는 GetVersion 지정된 DLL을 로드하고 해당 DllGetVersion 함수를 호출하려고 시도합니다. 성공하면 매크로를 사용하여 DLLVERSIONINFO 구조의 주 버전 번호와 부 버전 번호를 호출 애플리케이션으로 반환되는 DWORD로 압축합니다. DLL이 DllGetVersion 을 내보내지 않으면 함수는 0을 반환합니다. DllGetVersion이 DLLVERSIONINFO2 구조를 반환할 가능성을 처리하도록 함수를 수정할 수 있습니다. 이 경우 해당 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.
}

Project 버전

애플리케이션이 .dll 파일의 다른 대상 버전과 호환되도록 하기 위해 버전 매크로가 헤더 파일에 있습니다. 이러한 매크로는 서로 다른 버전의 DLL에 대한 특정 정의를 정의, 제외 또는 다시 정의하는 데 사용됩니다. 이러한 매크로에 대한 자세한 설명은 Windows 헤더 사용을 참조하세요.

예를 들어 매크로 이름 _ WIN32 _ IE는 일반적으로 이전 헤더에서 찾을 수 있습니다. 매크로를 16진수로 정의해야 합니다. 이 버전 번호는 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>

공용 컨트롤 정보