다음을 통해 공유


공용 컨트롤 버전

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

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

공용 제어 DLL 버전 번호

공용 컨트롤에 대한 지원은 모든 32비트 및 64비트 버전의 Windows가 포함된 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 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 버전 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 구조체이므로 이후 구조는 이전 버전과 호환됩니다.

다음 샘플 함수는 지정된 DLL을 로드하고 DllGetVersion 함수를 호출하려고 시도하는 GetVersion. 성공하면 매크로를 사용하여 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 정의됩니다. 다른 값을 정의하려면 메이크 파일의 컴파일러 지시문에 다음을 추가할 수 있습니다. 0x0400 원하는 버전 번호로 대체합니다.

/D _WIN32_IE=0x0400

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

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

공용 컨트롤 대한